2013-06-04 19 views
13

私はインデックスを入力することができるテンプレートを作成したいと思います。それはそのインデックスにタイプを与えます。私はdecltype(std::get<N>(tup))でこれを行うことができますが、私はこれを自分で実装したいと思います。例えば、私はこの、タプルからN番目の型を取得するには?

typename get<N, std::tuple<int, bool, std::string>>::type; 

を行うしたいと思います...と(配列は0から始まるインデックス化するので)それが位置N - 1で私のタイプを提供します。これどうやってするの?ありがとう。

+0

0x499602D2の罰金の答えが原因に関しては、私はあなたが標準ライブラリの形質を示唆答えを受け入れるべきだと思います。そうすることを検討してください。 – einpoklum

答えて

12

クラステンプレートと部分的な特殊化を使用して、必要な処理を行うことができます。 (std::tuple_elementはほとんど他の回答のように同じと言うん):

#include <tuple> 
#include <type_traits> 

template <int N, typename... Ts> 
struct get; 

template <int N, typename T, typename... Ts> 
struct get<N, std::tuple<T, Ts...>> 
{ 
    using type = typename get<N - 1, std::tuple<Ts...>>::type; 
}; 

template <typename T, typename... Ts> 
struct get<0, std::tuple<T, Ts...>> 
{ 
    using type = T; 
}; 

int main() 
{ 
    using var = std::tuple<int, bool, std::string>; 
    using type = get<2, var>::type; 

    static_assert(std::is_same<type, std::string>::value, ""); // works 
} 
+0

@ user1131467それは私がそれをやることにした方法です – 0x499602D2

10

この形質は既に存在し、std::tuple_elementと呼ばれています。

ここには、その使用法を示すlive exampleがあります。

+1

しかし私はこれを自分で実装したいと言った。 :) – user2030677

+0

* "私はこれを行うことができると知っていますが、私はこれを自分で実装したいと思います" *、これは答えではなくコメントです(OPは " std :: tuple_element')。 –

+0

@ user2030677:申し訳ありませんが、私は質問のテキストをよく読んでいたはずです - 何とかその部分をスキップしました:) –

関連する問題