Очевидно, что вы не можете иметь экземпляр типа 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<F>::type
.
Тем не менее, C ++ 0x все еще является новым для меня, и, конечно, все реализации все еще несколько экспериментальны, так что я немного обеспокоен этим.Можем ли мы действительно использовать std::tuple
как вектор типов для метапрограммирования?