也许您的困惑源于“比”更专业的关系如何运作。它是偏序,而不是全序——这意味着给定 2 个模板专业化,并不总是其中一个比另一个更专业。
Anon 的评论是正确的:假设第三个专业化不存在,并且稍后在您的代码中您有:
Promotion<Array<double>, Array<double> > foo;
(当然,您可能实际上不会创建此空结构类型的变量,但这只是强制实例化的最简单方法。)
鉴于此声明foo
,会选择前 2 个专业中的哪一个?
- 专业化 1 适用,并且
T = Array<double>
.
- 专业化 2 适用,其中
T1 = double
, T2 = double
.
两种专业都适用,因此我们需要确定哪个“比”另一个“更专业”,然后选择那个。如何?我们会说X
比更专业Y
如果是至少同样专业 as Y
, but Y
至少不像X
。虽然这看起来只是在绕这个问题,但我们可以用一个巧妙的规则来回答这个新问题:
X
至少与Y
if,无论我们分配给模板参数什么类型X
,结果类型总是可以匹配Y
.
请注意,我们忘记了当前实例化中涉及的特定类型(在本例中,double
)——“至少与”关系一样专业化是部分专业化本身的属性,并且不依赖于特定的实例化。
专业化 1 总是可以与专业化 2 匹配吗?这个过程有点像代数。我们要求这样做any type T
,我们可以找到类型T1
and T2
这样:
Promotion<Array<T1>, Array<T2> > = Promotion<T, T>
这意味着:
Array<T1> = T
Array<T2> = T
所以答案是否定的。给定任何类型,仅查看第一个隐含结果T
,一般来说是找不到类型的T1
这样Array<T1>
与以下类型相同T
。 (如果T
碰巧是Array<long>
,但不是如果T
is int
or char*
或大多数其他类型。)
反过来呢?专业化 2 总是可以与专业化 1 匹配吗?我们要求这样做any types T1
and T2
,我们可以找到一个类型T
这样:
Promotion<T, T> = Promotion<Array<T1>, Array<T2> >
暗示:
T = Array<T1>
T = Array<T2>
所以答案又是否定的。给定任何类型T1
,总是可以找到一种类型T
这样T
与以下类型相同Array<T1>
-- 按字面意思设置T = Array<T1>
。但一般来说其他类型T2
不限于与T1
,如果不是(例如,如果T1 = bool
but T2 = float
)那么就不可能找到类型T
这与两者相同Array<T1>
and Array<T2>
。所以一般情况下是不可能找到这样的类型的T
.
在这种情况下,不仅两个专业化都不比另一个更专业化,甚至也不比另一个专业化更专业化。专业化如另一个。因此,如果需要实例化此模板类并且两个专业化都匹配(正如 Anon 给出的示例所示),则无法选择“最佳”模板类。