C++テクニック!可変長引数テンプレートの値をインデックスで取得
早速ですが問題です。次のような場合、一体どうすればよいでしょうか?
template <class T...> class Hoge { private : // TODO: T...のうち、N番目の引数の型を取得したい! } ;
何のためにそんなのが欲しくなるのかはいまいち謎ですが、まあ、やるとしたらこんな感じになります。
// N≠0なら、先頭を削ってNをデクリメント template <size_t N, class T0, class ... T> struct type_at : public type_at<N - 1, T ...> {} ; // N=0なら、先頭の型が求めるべき型 template <class T0, class ... T> struct type_at<0, T0, T...> { typedef T0 type ; } ; template <class T...> void hoge() { type_at<2, T...>::type value ; // T...のインデックス2 … この場合はint } int main() { hoge<char, short, int, long>() ; }
もしもNがテンプレート引数の数以上であれば、ちゃんとコンパイル時にエラーとなってくれます。
なおstd::tupleを利用すると、多少書き方が面倒になりますが自作クラスは必要なくなります。
こんな感じ。
template <class T...> void hoge() { std::tuple_element<2, std::tuple<T...>>::type value ; // T...のインデックス2 }