20

インデックスを入力できるテンプレートを作成したいのですが、そのインデックスの型が得られます。これでできることはわかっていますがdecltype(std::get<N>(tup))、自分で実装したいと思います。たとえば、私はこれをやりたいのですが、

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

...そして、それは私に位置の型を与えますN - 1(配列は0から始まるインデックスを付けているため). これどうやってするの?ありがとう。

4

2 に答える 2

19

クラス テンプレートと部分的な特殊化を使用して、必要なことを行うことができます。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
}
于 2013-06-04T22:41:29.003 に答える
18

その特性はすでに存在し、 と呼ばれstd::tuple_elementます。

これは、その使用法を示す実際の例です。

于 2013-06-04T22:40:45.693 に答える