为了账号安全,请及时绑定邮箱和手机立即绑定

C ++函数模板部分专业化?

C ++函数模板部分专业化?

C++
至尊宝的传说 2019-11-13 14:43:50
我知道下面的代码是类的部分专业化:template <typename T1, typename T2> class MyClass {   … }; // partial specialization: both template parameters have same type template <typename T> class MyClass<T,T> {   … }; 我也知道C ++不允许函数模板部分专业化(仅允许完全专业化)。但是我的代码是否意味着我已将函数模板的一部分专门用于一个/相同类型的参数?因为它适用于Microsoft Visual Studio 2010 Express!如果否,那么您能否解释部分专业化概念?#include <iostream>using std::cin;using std::cout;using std::endl;template <typename T1, typename T2> inline T1 max (T1 const& a, T2 const& b) {     return a < b ? b : a; } template <typename T> inline T const& max (T const& a, T const& b){    return 10;}int main (){    cout << max(4,4.2) << endl;;    cout << max(5,5) << endl;    int z;    cin>>z;}
查看完整描述

3 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

在该示例中,您实际上是在重载(而不是专门化)该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 ++标准仅允许完全专业化(编译器扩展除外)。]


查看完整回答
反对 回复 2019-11-13
?
Helenr

TA贡献1780条经验 获得超3个赞

什么是专业化?


如果您真的想了解模板,则应该看一下功能语言。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 ++类模板的工作方式完全相同。您提供一个主声明,该声明声明参数的数量和性质。它可以只是一个声明,也可以充当定义(您的选择),然后您可以(如果您愿意)提供模式的特殊化,并将它们关联到该类的不同版本(否则将是愚蠢的) 。


对于模板函数,专业化有些尴尬:它与重载解析有些冲突。因此,已确定专门化将与非专门化版本相关,并且在重载解析期间将不考虑专门化。因此,选择正确函数的算法变为:


在常规功能和非专业模板之间执行重载解析

如果选择了非专业化模板,请检查是否存在专门化的模板,该模板会更好地匹配


这样,功能的模板专业化是第二区域的公民(从字面上看)。就我而言,如果没有它们,我们会更好:我还没有遇到过无法通过重载解决模板专业化使用的情况。


这是模板专业化吗?


不,这只是过载,这很好。实际上,重载通常会按我们预期的那样工作,而专业化可能令人惊讶


查看完整回答
反对 回复 2019-11-13
  • 3 回答
  • 0 关注
  • 453 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信