12.3.6 重载和优先级
如果有多个模板可供选择,编译器将选择特化程度最高的那个,如下所示。
template<class T1,class T2>class Example//通用类模板 { //类定义 }; template<class T2>class Example<int,T2>//部分特化 { //类定义 } template<>class Example<int,int>//显式特化 { //类定义 }在创建不同类的对象时,会有不同的模板被调用,如下所示。 Example<double,double>E1;//调用通用类模板 Example<int,float>E2;//调用部分特化 Example<int,int>E3;//调用显式特化
部分特化有两个重要的应用,如下所述。
(1)为指针提供特殊版本的模板。
template<class TYPE>//模板#1 class Example{……} template<class TYPE*>//模板#2 class Example{……}
如果提供的类型参数是指针,模板#2会被调用,否则,模板#1会被调用。
(2)为类模板的调用设置各种限制,如下所示。
template<class T1,class T2>//模板#1 class Example{……} template<class T1>//模板#2 class Example<T1,T1>{……}
当提供的两个类型参数相同时,模板#2会被调用,否则,模板#1会被调用。