部分模板专业化:为什么部分专业化列表中的某些变量与主要模板不同

时间:2019-03-05 16:24:50

标签: c++ templates

我正在从cppreference了解有关部分模板专业化的知识,并且我了解到来自部分专业化模板的参数数量必须与主参数匹配,并且参数列表不能与非专业参数相同。但是,我被变量的命名绊倒了。 在下面的代码中:

template<class T1, class T2, int I>
class A {};            // primary template

template<class T, int I>
class A<T, T*, I> {};  // #1: partial specialization where T2 is a pointer to T1

template<class T, class T2, int I>
class A<T*, T2, I> {}; // #2: partial specialization where T1 is a pointer

template<class T>
class A<int, T*, 5> {}; // #3: partial specialization where T1 is int, I is 5,
                        //     and T2 is a pointer

template<class X, class T, int I>
class A<X, T*, I> {};   // #4: partial specialization where T2 is a pointer

我不明白为什么使用T和X而不是T1,就像这样做的目的是什么。

1 个答案:

答案 0 :(得分:0)

在模板专业化中,您为模板参数选择的名称是无声变量。以下所有内容完全等同于

template<class T, class U, int N> class A<T, U, N> { /*...*/ };
template<class U, class T, int N> class A<U, T, N> { /*...*/ };
template<class F, class G, int Z> class A<F, G, Z> { /*...*/ };
template<class OnceUpon, class ATime, int ThereWere> class A<OnceUpon, ATime, ThereWere> { /*...*/ };

特别是,您选择的名称​​ 不必与“原始”模板定义的名称匹配。


在评论中,您询问:

  

在我的问题#1和#3的代码中,分别具有2和1参数列表。像为什么不包含主要模板的参数列表中的其他变量?

这是 partial 专业化的工作方式。但是让我们备份一下。

这是模板类:

template<class T1, class T2>
struct X
{};

这是它的显式专业化:

X<int, int>;

现在,假设我想用X<T1, T2>T1 == T2定义一个行为,这不仅意味着X<int, int>,而且意味着X<double, double>X<float&, float&>X<std::string, std::string>,以及这些显式专业领域的所有无限性。

为此,我需要定义一种依赖于一种类型的局部专门化(一种同时扮演T1T2的角色)。因此,template<class T>将引入这种专业化:只有一种类型:

template<class T>
struct X<T, T>
{ using type = T; };

如果您使用了两个参数(template<class T, class WhatToDoWithThatType>),那么第二个参数的用途是什么?