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

我知道下面的代码是类的部分专业化:


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;

}


至尊宝的传说
浏览 456回答 3
3回答

翻翻过去那场雪

在该示例中,您实际上是在重载(而不是专门化)该max<T1,T2>函数。偏专业化语法应该看起来有点像下面(要是让)://Partial specialization is not allowed by the spec, though!template <typename T>&nbsp;inline T const& max<T,T> (T const& a, T const& b){&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ^^^^^ <--- specializing here&nbsp; &nbsp; return 10;}[注意:对于功能模板,C ++标准仅允许完全专业化(编译器扩展除外)。]

Helenr

什么是专业化?如果您真的想了解模板,则应该看一下功能语言。C ++中的模板世界是其自身的纯功能子语言。在功能语言中,选择是使用模式匹配完成的:-- An instance of Maybe is either nothing (None) or something (Just a)-- where a is any typedata Maybe a = None | Just a-- declare function isJust, which takes a Maybe-- and checks whether it's None or JustisJust :: Maybe a -> Bool-- definition: two cases (_ is a wildcard)isJust None = FalseisJust Just _ = True如您所见,我们重载了的定义isJust。好吧,C ++类模板的工作方式完全相同。您提供一个主声明,该声明声明参数的数量和性质。它可以只是一个声明,也可以充当定义(您的选择),然后您可以(如果您愿意)提供模式的特殊化,并将它们关联到该类的不同版本(否则将是愚蠢的) 。对于模板函数,专业化有些尴尬:它与重载解析有些冲突。因此,已确定专门化将与非专门化版本相关,并且在重载解析期间将不考虑专门化。因此,选择正确函数的算法变为:在常规功能和非专业模板之间执行重载解析如果选择了非专业化模板,请检查是否存在专门化的模板,该模板会更好地匹配这样,功能的模板专业化是第二区域的公民(从字面上看)。就我而言,如果没有它们,我们会更好:我还没有遇到过无法通过重载解决模板专业化使用的情况。这是模板专业化吗?不,这只是过载,这很好。实际上,重载通常会按我们预期的那样工作,而专业化可能令人惊讶
打开App,查看更多内容
随时随地看视频慕课网APP