12.2.4 特化

    C++引入了特化(Explicit Specialization)来解决某些类型在函数中的特殊操作,当编译器寻找到函数调用的特化后,使用特化的定义,不再使用模板函数。

    特化的基本格式如下所示。


    template<>返回类型函数名[<类型实参表>](函数参数表) { //函数体定义 }

    类型实参表可以省略,由后续的函数参数表来指定。

    显式实例化是指使用模板生成某些类型参数的模板函数,而特化是指不使用模板生成函数定义,而是单独为某些类型参数生成函数定义,这也是为什么特化有函数体的原因。

    在使用特化函数时,须完成其定义在前面或者在后面定义均可,但在使用前要对其进行声明,先来看一个简单的例子,如代码12.5所示。

    代码12.5 特化ExplicitSpecialization


    <———————————-文件名:example1205.cpp———————————————> 01 #include<iostream> 02 using namespace std; 03 template<class Ex> 04 Ex Greater(Ex x,Ex y); 05 template<>double Greater<double>(double,double);//特化声明 06 int main() 07 { 08 int intX=1,intY=2; 09 double dblX=3. 0,dblY=2.9; 10 11 cout<<Greater(intX,intY)<<endl;//隐式实例化 12 cout<<Greater(dblX,dblY)<<endl;//优先调用特化函数 13 return 0; 14 } 15 template<class Ex> 16 Ex Greater(Ex x,Ex y) 17 { 18 return x>y?x:y; 19 } 20 template<>double Greater(double x,double y)//特化定义 21 { 22 return x+y; 23 }

    输出结果如下所示。


    2 5.9

    【代码解析】代码第20行定义了一个特化函数,将比大小的操作改成了加和操作,在调用“Greater(dblX,dblY)”时,特化函数优先于模板函数。