2016-03-16 14 views
5

Mam kod coś takiego:wyciągania rodzajów krotki za

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

Aby wyprowadzić parametry typu szablon krotka był tworzony z, zrobiłem ten rzucania:

static_cast<T*>(nullptr) 

i przekazać to jako parametr funkcji

Czy popełniam błąd UB? Czy istnieje lepszy sposób?

+0

Nie ma nic złego w rzucaniu wskaźnika pustego do typu, o ile nie usuwa się go. Co starasz się zrobić? – Barry

+0

Po prostu potrzebuję pakietu parametrów "A ..." w funkcji i nie wiem jak uzyskać go w inny sposób, poza sztuczką indeksów i ':: std :: tuple_element <>' – user1095108

+0

Jedną z zalet trzymania się z 'tuple_size' i' tuple_element' oznacza, że ​​twój kod działa również z 'std :: pair' i' std :: array' również za darmo. –

Odpowiedz

5

Niedoskonałość polega na tym, że nie możemy częściowo specjalizować szablonów funkcji. Twoja droga jest w porządku, ponieważ nie wyłuskujemy zerowego wskaźnika; Wolałbym używać oznaczonego znacznika:

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>{}); 
}