This answer转发声明模板类备注单向,并以另一种方式实现了它的部分特化。
所以,前言声明是:
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只是包装中的第一个元素。
代码编译得很好,所以我想应该有一个简单的解释为什么允许这样做。
那么,为什么允许在模板专门化中切换模板参数呢?是因为模板专业化是一种独立的类型吗?
答案 0 :(得分: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的模板参数是未指定的,即通用的。在使用它之前,我们需要“声明”这些通用参数
将部分模板特化的模板参数仅视为专业化所需的通用paraeters的声明。因为没有真正的模板参数,所以它们没有模板参数的限制:请注意,在专门化中我使用了两个可变参数包,这在模板中是不允许的。