読者です 読者をやめる 読者になる 読者になる

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
}