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

It is allowed to switch template arguments in a template specialization?

本文关键字:参数 专用      更新时间:2023-10-16

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

因此,前向声明是:

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

和部分专业化这个:

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

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

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

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

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

考虑一个例子:

// 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元函数的部分特化中,我们正在做的是将模板专用化为两个未指定的类型列表。因此,类型点的模板参数是未指定的,即泛型的。我们需要在使用之前"声明"该泛型参数。
仅将部分模板专用化的模板参数视为专用化所需的通用参数的声明。因为没有真正的模板参数,所以它们没有模板参数的限制:请注意,在专业化中,我使用了两个可变参数包,这在模板中是不允许的。