目录
一、类模板特化类模板全特化1.常规全特化2.特化成员函数而不是模模板类模板偏特化(局部特化)1.模板参数数量2.模板参数范围上二、函数模板特化函数模板全特化函数模板偏特化三、模板特化版本放置位置建议一、类模板特化
特化: 对特殊的类型(类型模板参数)进行特殊的对待,特别给它写适合它的专用代码。
泛化:模板,可以随便指定类型。
类模板全特化
//泛化版本template<typename T,typename U>struct TC{TC() {cout << "泛化构造函数" << endl;}void functest() {cout << "泛化" << endl;}};
1.常规全特化
必须先有泛化版本,才能存在特化版本。只要涉及特化,一定先存在泛化。 特化版本代码编译器会优先选择,覆盖泛化版本。
template<>struct TC<int,int>{TC() {cout << "全特化构造函数" << endl;}void functest() {cout << "int,int全特化" << endl;}};template<>struct TC<double,int>{void functest() {cout << "double,int全特化" << endl;}};//特化有优先权利,编译器优先选择
2.特化成员函数而不是模模板
//特化成员函数template<>void TC<double,double>::functest() {cout << "double,double全特化" << endl;}int main () {TC<double,double>tbdfd;//泛化版本对象, 调用的是泛化版本的构造函数。tbdfd.functest();//因为我们特化了double, double类型的functest函数,所以这里调用的是特化的functest()函数。return 0;}
类模板偏特化(局部特化)
偏特化从两方面说起:一个是从模板参数数量上,一个是从模板参数范围上
template<typename T,typename U,typename G>struct TG{TG() {cout << "泛化构造函数" << endl;}void functest() {cout << "泛化" << endl;}};
1.模板参数数量
//偏特化//从参数数量上进行偏特化,我们现在绑2个类型模板参数。留1个模板类型参数。template<typename G>struct TG<int,int,G>{TG() {cout << "偏特化构造函数" << endl;}void functest() {cout << "偏特化" << endl;}};int main() {TG<int,double,int> tg1;//泛化版本tg1.functest(); //泛化版本functestTG<int,int,int> tg2;//偏特化版本tg2.functest(); //偏特化版本functestreturn 0;}
2.模板参数范围上
int, const int(比int小)。
原来T,现在T(从任意类型T索晓伟指针类型T)**
原来是T,现在T&左值引用,或者现在是T&&(右值引用),都叫范围缩小。
template<typename T>struct TT{TT() {cout << "泛化构造函数" << endl;}void functest() {cout << "泛化" << endl;}};template<typename T>struct TT<const T>{TT() {cout << "const特化构造函数" << endl;}void functest() {cout << "const特化" << endl;}};template<typename T>struct TT<T*>{TT() {cout << "指针特化构造函数" << endl;}void functest() {cout << "指针特化" << endl;}};template<typename T>struct TT<T&>{TT() {cout << "左值特化构造函数" << endl;}void functest() {cout << "左值特化" << endl;}};template<typename T>struct TT<T&&>{TT() {cout << "右值特化构造函数" << endl;}void functest() {cout << "右值特化" << endl;}};int main() {TT<int *> ttint;ttint.functest();//局部特化,特化之后还是个模版,全特化,特化之后变成了一个类return 0;}
二、函数模板特化
template<typename T,typename U>void tfunc(T &temp1,U &temp2) {cout << "tfunc泛化版本" << endl;}template<>void tfunc(int &t1,double &d) {cout << "tfunc函数特化版本" << endl;}//重载 优先于模版函数,同时存在模版函数跟普通函数,编译器优先现在普通函数void tfunc(int &t1,double &d) {cout << "tfunc函数特化版本" << endl;}
函数模板全特化
int main() {//泛化版本const char *p = "I Love China!";int q = 12;tfunc(p,q);// 重载优先,不会调用全特化版本了int ii1 = 12;double d1 = 12.0f;tfunc(ii1,d1);return 0;}
函数模板偏特化
函数模板不能偏特化