C+范型——模板的具现
在程序源文件中可以采用多种模板来编写一个范型的程序功能模块,他可能是特化模板,偏特化模板(函数模板没有偏特化)以及全特化模板,或者这几种范型模块共存,当多个同一名称范型模块共存的时候,如果源程序出现了这个名称的功能模块的调用,那么编译器势必要在同名的模块中选择一个作为生成实体模块代码的模板,这个选择原则便是C++模板的具现规则:
编译器对一个模块调用的优先顺序是:
特化模板>>偏特化模板>>普通模板>>系统
代码示例
1 #include<iostream> 2 using namespace std; 3 //函数模板 4 //普通函数模板fm 5 template<typename T> 6 T fm(T t1) 7 { 8 cout<<"普通函数模板"<<endl; 9 return t1; 10 } 11 //fm的指针特化模板 12 template<typename T> 13 T* fm(T* t1) 14 { 15 cout<<"int指针特化模板"<<endl; 16 return t1; 17 } 18 //fm的int特化模板 19 template<> 20 int fm(int t1) 21 { 22 cout<<"int特化函数模板"<<endl; 23 return t1; 24 } 25 template<> 26 float fm(float t1) 27 { 28 cout<<"float特化模板"<<endl; 29 return t1; 30 } 31 //普通类模板Test 32 template<typename T1,typename T2> 33 class Test 34 { 35 public: 36 void ply() 37 { 38 cout<<"普通类模板"<<endl; 39 } 40 }; 41 template<typename T1> 42 class Test<T1,int> 43 { 44 public: 45 void ply() 46 { 47 cout<<"int偏特化类模板"<<endl; 48 49 } 50 }; 51 template<> 52 class Test<char,int> 53 { 54 public: 55 void ply() 56 { 57 cout<<"全特化类模板"<<endl; 58 } 59 }; 60 //测试程序 61 int main() 62 { 63 int a =23; 64 int *p =&a; 65 66 cout<<fm(a)<<endl; 67 cout<<fm(p)<<endl; 68 float f =23.4; 69 cout<<fm(f)<<endl; 70 double d= 99.45; 71 cout<<fm(d)<<endl; 72 cout<<endl; 73 Test<char,char>TT1; 74 TT1.ply(); 75 Test<int,int>TT2; 76 TT2.ply(); 77 Test<char,int>TT3; 78 TT3.ply(); 79 return 0; 80 }
输出结果
int特化函数模板 23 int指针特化模板 0x7fff57615988 float特化模板 23.4 普通函数模板 99.45 普通类模板 int偏特化类模板 全特化类模板
我们再把代码修改一下:把75行到78行注释掉42行的int换成char
输出结果
int特化函数模板 23 int指针特化模板 0x7fff58183988 float特化模板 23.4 普通函数模板 99.45 int偏特化类模板
可以看出同时存在Test<T1,char>(偏特化模板) , Test<T1,T2> (普通模板)的时候,优先编译偏特化模板而不是普通模板。

浙公网安备 33010602011771号