Очевидно, у вас не может быть экземпляра типа void
в правильно сформированной программе, поэтому что-то вроде следующего объявления не будет компилироваться:
std::tuple<void, double, int> tup;
Однако, пока мы имеем дело исключительно с типами, а не с объектами, вроде бы никаких проблем. Например, мой компилятор (GCC) позволяет мне сказать:
typedef std::tuple<void, double, int> tuple_type;
Это интересно мне, потому что кажется, что с C ++ 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
.
Тем не менее, C ++ 0x все еще нов для меня, и, конечно, все его реализации все еще в некоторой степени экспериментальны, поэтому я немного обеспокоен этим. Можем ли мы действительно использовать std :: tuple
как вектор типов для метапрограммирования?