允许在模板专门化中切换模板参数?

时间:2013-09-11 15:48:43

标签: c++ templates c++11 template-specialization

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只是包装中的第一个元素。

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

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

1 个答案:

答案 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的声明。因为没有真正的模板参数,所以它们没有模板参数的限制:请注意,在专门化中我使用了两个可变参数包,这在模板中是不允许的。

相关问题