我正在从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,就像这样做的目的是什么。
答案 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>
,以及这些显式专业领域的所有无限性。
为此,我需要定义一种依赖于一种类型的局部专门化(一种同时扮演T1
和T2
的角色)。因此,template<class T>
将引入这种专业化:只有一种类型:
template<class T>
struct X<T, T>
{ using type = T; };
如果您使用了两个参数(template<class T, class WhatToDoWithThatType>
),那么第二个参数的用途是什么?