模板的特化
模板分为类模板和函数模板,特化分为全特化和偏特化(特化是对模板的特化,因此必须存在模板才可以进行特化)
- 全特化:给模板中的所有模板参数指定一个具体的类
- 偏特化:部分指定模板参数的类
- 类模板可以全特化也可以偏特化
- 函数模板只能全特化(因为重载可以达到偏特化的效果)
类:
1 template<typename T1, typename T2> 2 class Test 3 { 4 public: 5 Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;} 6 private: 7 T1 a; 8 T2 b; 9 }; 10 11 template<> 12 class Test<int , char> 13 { 14 public: 15 Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;} 16 private: 17 int a; 18 char b; 19 }; 20 21 template <typename T2> 22 class Test<char, T2> 23 { 24 public: 25 Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;} 26 private: 27 char a; 28 T2 b; 29 };
函数:
1 //模板函数 2 template<typename T1, typename T2> 3 void fun(T1 a , T2 b) 4 { 5 cout<<"模板函数"<<endl; 6 } 7 8 //全特化 9 template<> 10 void fun<int ,char >(int a, char b) 11 { 12 cout<<"全特化"<<endl; 13 } 14 15 //函数不存在偏特化:下面的代码是错误的 16 /* 17 template<typename T2> 18 void fun<char,T2>(char a, T2 b) 19 { 20 cout<<"偏特化"<<endl; 21 } 22 */