2013-08-05 10 views
8

私は要素型のインデックスを取得するタプル要素の型のインデックスを取得しますか?

std::tuple<T0, T1, T2, ...> 

そして、どのようなさまざまな要素型を持つタプルを持っている場合は?

template<class T, class Tuple> 
struct Index 
{ 
    enum {value = ?;} 
}; 

ありがとうございます。

+0

'std :: tuple 'があり、 'int'を要求するとどうなりますか?また、なぜこれが必要ですか? – Borgleader

+0

タプルの要素タイプが異なると仮定します。そのような前提がない場合は、いずれか1つの試合がうまくいく。与えられた基本クラスの派生クラスタプルによって、効率的な抽象ファクトリを実装するために使用します。 – user1899020

+0

特定の環境、あるいは一般的なC++だけを探していますか? – css

答えて

12
template <class T, class Tuple> 
struct Index; 

template <class T, class... Types> 
struct Index<T, std::tuple<T, Types...>> { 
    static const std::size_t value = 0; 
}; 

template <class T, class U, class... Types> 
struct Index<T, std::tuple<U, Types...>> { 
    static const std::size_t value = 1 + Index<T, std::tuple<Types...>>::value; 
}; 

See it live at Coliru

この実装は、指定された型の最初のオカレンスのインデックスを返します。タプルにない型のインデックスを要求すると、コンパイルエラーが発生します(それはかなり醜いものです)。

+0

型が要素型の中にない場合、どのような振る舞いですか? – user1899020

+0

@ user1899020 [コンパイル時エラー。](http://coliru.stacked-crooked.com/view?id=00d44c11b2bfb4ce09cd43c8bfe57739-c944ac6b0eed3bfc48b1f78a894f6965) – Casey

+0

私は 'std :: cout <<"インデックス = " << Index :: value << std :: endl; ' 1を返します。 – user1899020