Очевидно, вы не можете иметь экземпляр типа void в хорошо сформированной программе, поэтому что-то вроде следующего объявления не будет компилироваться:
std::tuple<void, double, int> tup;
Однако, если мы имеем дело исключительно с типами, а не с объектами, то, похоже, не проблема. Например, мой компилятор (GCC) позволяет мне сказать:
typedef std::tuple<void, double, int> tuple_type;
Мне это интересно, потому что кажется, что с С++ 0x мы можем просто использовать std::tuple для выполнения многих метапрограммных трюков, которые раньше требовали бы библиотеки boost::mpl. Например, мы можем использовать std::tuple для создания вектора типов.
Например, предположим, что мы хотим создать вектор типов, представляющих сигнатуру функции:
Можно просто сказать:
template <class R, class... Args>
struct get_function_signature;
template <class R, class... Args>
struct get_function_signature<R(*)(Args...)>
{
typedef std::tuple<R, Args...> type;
};
Кажется, что это работает, даже если подпись функции имеет тип void, если мы фактически не создаем экземпляр get_function_signature<F>::type.
Однако С++ 0x для меня все еще новичок, и, конечно, все реализации все еще несколько экспериментальны, поэтому я немного неспособен по этому поводу. Можем ли мы использовать std::tuple как вектор типов для метапрограммирования?