允许在模板专用化中切换模板参数
It is allowed to switch template arguments in a template specialization?
这个答案向前声明模板类 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
元函数的部分特化中,我们正在做的是将模板专用化为两个未指定的类型列表。因此,类型点的模板参数是未指定的,即泛型的。我们需要在使用之前"声明"该泛型参数。
仅将部分模板专用化的模板参数视为专用化所需的通用参数的声明。因为没有真正的模板参数,所以它们没有模板参数的限制:请注意,在专业化中,我使用了两个可变参数包,这在模板中是不允许的。
相关文章:
- 具有常量引用参数的函数模板专用化
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 具有可变参数非类型参数的模板专用化
- 类专用化,没有用作专用化模板参数的类的模板参数
- 基于枚举参数调用专用模板方法
- 检查类是否具有模板专用化(使用布尔值或 int 等模板参数)
- 专用于可变参数模板成员函数
- 如何将模板类专用化为也接受模板模板参数
- 调用模板专用化,具有更多参数的单参数模板调用的特定值
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- C++ 将派生类的成员函数指针作为参数传递时选择了错误的模板专用化
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 具有不同非类型模板参数的模板类部分专用化
- 带有void类型和参数的C++11模板专用化
- 如何进行模板化类型化参数专用化?
- C++具有可变参数专用参数的模板,用于参数数量
- 使用类型参数专用化部分模板参数(VC++ v140 工具集)
- 模板模板可变参数专用化
- 将可变模板模板参数专用于最小数量的参数:合法或不合法