有没有办法提取模板的参数列表以放入另一个元函数?
Is there a way to pull out a template's parameter list to put into another metafunction?
假设我有一个 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 {};
如何从包含的 list
类型中获取 Ts...
以便我可以将其放入 get_at
元函数?
您不必这样做。再写一个元函数就可以了(任何问题都可以通过另一层间接来解决?):
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_type
或 false_type
继承对于这个用例没有意义。您覆盖了 type
,但是 get_at
上仍然有 operator bool()
,这对于这种用法没有任何意义。最好直接写 value
,例如:
template <typename T, typename ...Ts>
struct get_at<0, T, Ts...>
{
typedef T type;
static constexpr bool value = true;
};
假设我有一个 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 {};
如何从包含的 list
类型中获取 Ts...
以便我可以将其放入 get_at
元函数?
您不必这样做。再写一个元函数就可以了(任何问题都可以通过另一层间接来解决?):
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_type
或 false_type
继承对于这个用例没有意义。您覆盖了 type
,但是 get_at
上仍然有 operator bool()
,这对于这种用法没有任何意义。最好直接写 value
,例如:
template <typename T, typename ...Ts>
struct get_at<0, T, Ts...>
{
typedef T type;
static constexpr bool value = true;
};