2017-02-22 18 views
1

ли что-то подобное можно:Получить специальный параметр типа рекурсивного VARIADIC шаблона

#include <iostream> 
#include <string> 

template<typename T1, typename T2, typename T3, typename T4, class ...Ts> 
struct third_t { 

    typedef typename third_t<T2,T3,T4,Ts...>::type type; 
}; 

template<typename T1,typename T2, typename T3> 
struct third_t<T1,T2,T3,void> { 

    typedef T3 type; 
}; 

int main() { 

    third_t<int,int,std::string,unsigned>::type z = "test"; 

    std::cout<<"string type: "<<z<<std::endl; 
} 

Если да, то почему не специализированный случая найден? То есть это даже не рассматривается в резолюции.

я получаю ошибку:

main.cpp: In instantiation of 'struct third_t<int, int, std::__cxx11::basic_string<char>, unsigned int>': 

main.cpp:18:46: required from here 

main.cpp:7:56: error: wrong number of template arguments (3, should be at least 4) 

    typedef typename third_t<T2,T3,T4,Ts...>::type type; 

обновление:

я понял, что мое первоначальное ложное предположение заставило меня думать, что я мог «перегрузка» класс, а также, что, конечно, бред какой то. Принимая во внимание, что-то подобное можно сделать с помощью шаблонов функций, которые

template<typename T1,typename T2, typename T3> 
struct third_t { ... }; 

не может быть сделан с помощью шаблонов классов, если это было бы возможно извлечь третий последних параметра из параметров шаблона.

ответ

1

why isn't the specialized case found?

Потому что не в конце списка типов из

third_t<int,int,std::string,unsigned>::type z = "test"; 

void Если вы попытаетесь с

third_t<int,unsigned,int,std::string,void>::type z = "test"; 

компиляцией.

- EDIT -

ОП просят получить третий тип, используя "recorsive строительство".

Таким образом, я предлагаю построение типов типов, которые получают n-й тип (где n - параметр шаблона) списка типов.

Нечто подобное

template <std::size_t N, typename, typename ... Ts> 
struct nth_t 
{ using type = typename nth_t<N-1U, Ts...>::type; }; 

template <typename T0, typename ... Ts> 
struct nth_t<0U, T0, Ts...> 
{ using type = T0; }; 

Таким образом, третий параметр может быть найден с использованием индекса 2U (как обычно в C/C++, начиная с 0U) следующим образом

nth_t<2U, int, int, std::string, void>::type z = "test"; 
+0

Спасибо, что было решение , – FloriHe

+0

Тем не менее, я думаю о возможности того, как я могу сделать это более общим, т. Е. Без уродливого четвертого параметра void – FloriHe

+0

@FloriHe - но точно ... чего вы хотите получить? – max66

Смежные вопросы