有没有办法拉出模板的参数列表以放入另一个元函数?

时间:2015-01-11 16:47:19

标签: c++ templates c++11 variadic-templates

假设我有一个get_at元函数,它从可变参数模板参数列表中获取第N个类型:

template <int I, typename ...Ts>
struct get_at;

template <int I, typename T, typename ...Ts>
struct get_at<I, T, Ts...> : public get_at<I-1, Ts...>
{
};

template <typename T, typename ...Ts>
struct get_at<0, T, Ts...> : public std::true_type
{
  typedef T type;
};

template <int I>
struct get_at<I> : public std::false_type
{
};

我想将Ts...存储在列表类型中,如下所示:

template <typename... Ts>
struct list {};

如何从Ts...类型中获取list,以便我可以将其放入get_at元函数中?

1 个答案:

答案 0 :(得分:2)

你不必。只写另一个元函数(任何问题都可以通过另一层间接解决?):

template <int I, typename Seq>
struct get_at_seq;

template <int I, typename... Ts>
struct get_at_seq<I, list<Ts...>>
: get_at<I, Ts...>
{ };

甚至:

template <int I, template <typename...> class C, typename... Ts>
struct get_at_seq<I, C<Ts...>>
: get_at<I, Ts...>
{ };

但请注意,继承自true_typefalse_type对此用例没有意义。您覆盖了type,但是operator bool()上仍然有get_at,这对此用法毫无意义。最好明确写入value,例如:

template <typename T, typename ...Ts>
struct get_at<0, T, Ts...>
{
    typedef T type;
    static constexpr bool value = true;
};