Пустой тип в std :: tuple - PullRequest
       25

Пустой тип в std :: tuple

17 голосов
/ 03 февраля 2011

Очевидно, что вы не можете иметь экземпляр типа 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 как вектор типов для метапрограммирования?

Ответы [ 2 ]

10 голосов
/ 03 февраля 2011

Это действительно имеет смысл, что вы можете сделать

typedef std::tuple<void, double, int > tuple_type;

, если вы используете его только как список типов для использования tuple_element.Таким образом, я могу сделать

tuple_element<0,tuple_type>::type * param;

, который объявит param как void*

0 голосов
/ 03 февраля 2011

Возможно, tuple с элементом void безопасен, если мы его не создадим.
Итак, хотя мы не можем написать следующее:

struct C : std::tuple< void > {...

Я не могу представить себе, что это использование сейчас полезно. Так что, это не имеет значения.

Ну, это также относится к std::pair. Мы можем написать простой список типов следующим образом:

struct Nil;
typedef std::pair< void, std::pair< int, Nil > > t;

хотя как-то такое pair использование кажется редким.

Кстати, список типов tuple может не работать в какой-то SFINAE-подобной цели. Например, следующий код не скомпилирован на ideone (gcc-4.5.1), когда я испытываться:

std::tuple< void > f();
template< class T > char g( T const& );

int main() {
  sizeof g( f() );
}

Итак, я не уверен, что текущие списки типов могут быть полностью заменены tuple в ближайшее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...