Тип Void в std :: tuple

Очевидно, у вас не может быть экземпляра типа 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 :: type .

Тем не менее, C ++ 0x все еще нов для меня, и, конечно, все его реализации все еще в некоторой степени экспериментальны, поэтому я немного обеспокоен этим. Можем ли мы действительно использовать std :: tuple как вектор типов для метапрограммирования?

17
задан Channel72 3 February 2011 в 11:05
поделиться