3 回答
TA贡献2065条经验 获得超14个赞
在该示例中,您实际上是在重载(而不是专门化)该max<T1,T2>函数。偏专业化语法应该看起来有点像下面(要是让):
//Partial specialization is not allowed by the spec, though!
template <typename T>
inline T const& max<T,T> (T const& a, T const& b)
{ ^^^^^ <--- specializing here
return 10;
}
[注意:对于功能模板,C ++标准仅允许完全专业化(编译器扩展除外)。]
TA贡献1780条经验 获得超4个赞
什么是专业化?
如果您真的想了解模板,则应该看一下功能语言。C ++中的模板世界是其自身的纯功能子语言。
在功能语言中,选择是使用模式匹配完成的:
-- An instance of Maybe is either nothing (None) or something (Just a)
-- where a is any type
data Maybe a = None | Just a
-- declare function isJust, which takes a Maybe
-- and checks whether it's None or Just
isJust :: Maybe a -> Bool
-- definition: two cases (_ is a wildcard)
isJust None = False
isJust Just _ = True
如您所见,我们重载了的定义isJust。
好吧,C ++类模板的工作方式完全相同。您提供一个主声明,该声明声明参数的数量和性质。它可以只是一个声明,也可以充当定义(您的选择),然后您可以(如果您愿意)提供模式的特殊化,并将它们关联到该类的不同版本(否则将是愚蠢的) 。
对于模板函数,专业化有些尴尬:它与重载解析有些冲突。因此,已确定专门化将与非专门化版本相关,并且在重载解析期间将不考虑专门化。因此,选择正确函数的算法变为:
在常规功能和非专业模板之间执行重载解析
如果选择了非专业化模板,请检查是否存在专门化的模板,该模板会更好地匹配
这样,功能的模板专业化是第二区域的公民(从字面上看)。就我而言,如果没有它们,我们会更好:我还没有遇到过无法通过重载解决模板专业化使用的情况。
这是模板专业化吗?
不,这只是过载,这很好。实际上,重载通常会按我们预期的那样工作,而专业化可能令人惊讶
- 3 回答
- 0 关注
- 474 浏览
添加回答
举报