0

这个答案以一种方式声明模板类备忘录,并以另一种方式实现它的部分专业化。

所以,前向声明是:

template <template <typename...> class Container, typename...> struct Memo;

和部分专业化:

template <typename R, typename... Args, template <typename...> class Container>
struct Memo<Container, R, std::tuple<Args...>>

Container 模板参数与可变参数模板参数切换(希望有人理解我刚刚写的内容)。R 只是包中的第一个元素。

代码编译得很好,所以我想应该有一个简单的解释为什么允许这样做。

那么,为什么允许在模板特化中切换模板参数呢?是因为模板特化是一个独立的类型吗?

4

1 回答 1

0

部分模板特化中模板参数的顺序根本不重要。那是因为部分模板特化并不是真正的模板,它只是现有模板的特化。
这意味着部分模板特化的模板参数集不是模板的参数,只是特化使用/需要的泛型参数集的声明

考虑一个例子:

// A typelist template:
template<typename... Ts>
struct type_list {};

// A metafunction for concatenating typelists (Forward declaration):
template<typename LIST1 , typename LIST2>
struct concat;

//The partial specialization of that template for typelists:
template<typename... Ts , typename... Us>
struct concat<type_list<Ts...> , type_list<Us...>>
{
    using result = type_list<Ts...,Us...>;
};

concat元函数的部分特化中,我们正在做的是将模板特化为两个未指定的类型列表。所以typelits的模板参数是未指定的,也就是泛型的。我们需要在使用它之前“声明”那个泛型参数。
仅将部分模板特化的模板参数视为特化所需的泛型参数的声明。因为没有真正的模板参数,所以没有模板参数的限制:注意,在特化中我使用了两个可变参数包,这在模板中是不允许的。

于 2013-09-14T11:49:24.920 回答