2016-03-16 2 views
5

У меня есть код что-то вроде этого:выводя типы кортежа в

template <typename T> 
inline typename ::std::enable_if< 
    is_std_tuple<T>{}, 
    T 
>::type 
get() 
{ 
    // pull tuple's elements from somewhere 
} 

Для того, чтобы вывести параметры типа шаблона кортеж был инстанцирован с, я сделал этот кастинг:

static_cast<T*>(nullptr) 

и передать этот как параметр к функции

template <typename ...A> 
void deduce_tuple(::std::tuple<A...>* const); 

Я принимаю UB? Есть ли способ лучше?

+0

Нет ничего плохого в том, что вы бросаете нулевой указатель на тип, если вы его не разыскиваете. Что вы все пытаетесь сделать? – Barry

+0

Мне нужен пакет параметров «A ...» в функции и не знаю, как получить его иначе, кроме как с трюком индексов и ':: std :: tuple_element <>' – user1095108

+0

Одно из преимуществ прилипания к 'tuple_size' и' tuple_element' - это то, что ваш код работает с 'std :: pair' и' std :: array' тоже бесплатно. –

ответ

5

Несовершенство здесь состоит в том, что мы не можем частично специализировать шаблоны функций. Твой путь прекрасен, так как мы не разыскиваем нулевой указатель; Я бы предпочел использовать назначенный тег:

template <typename...> struct deduction_tag {}; 

template <typename... Ts> 
std::tuple<Ts...> get(deduction_tag<std::tuple<Ts...>>) { 
    // […] 
} 
template <typename T> 
std::enable_if_t<is_std_tuple<T>{}, T> get() { 
    return get(deduction_tag<T>{}); 
}