2017-02-22 17 views
1

の特殊なタイプのパラメータを取得している可能性のようなものです:はい、なぜ見つかった専門的なケースではない場合は、再帰的な可変長引数テンプレート

#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,unsigned,int,std::string,void>::type z = "test"; 

コンパイルしてみた場合void

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

の種類のリストの最後にはありませんので。

- EDIT -

OPは "recorsive建設" を使用して第三のタイプを取得するために頼みます。

したがって、タイプリストのn番目のタイプ(テンプレートパラメータであるn)を取得するタイプ形質のコストをお勧めします。そこで第三のパラメータは、(0Uから出発して、C/C++でいつものように)インデックス2Uを用いて求めることができる

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

何か

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

おかげで、次のように、それは溶液でした。 – FloriHe

+0

それにもかかわらず、私はこれをより一般的なものにする可能性について考えています。すなわち、醜い第4のvoidパラメータなしで。 – FloriHe

+0

@FloriHe - しかし、まさに...あなたは何を得たいですか? – max66

関連する問題