100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > C++基础学习-33模板全特化 偏特化(局部特化)

C++基础学习-33模板全特化 偏特化(局部特化)

时间:2022-12-08 15:39:54

相关推荐

C++基础学习-33模板全特化 偏特化(局部特化)

目录

一、类模板特化类模板全特化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;}

函数模板偏特化

函数模板不能偏特化

三、模板特化版本放置位置建议

模板定义、实现都放在一个 .h中;模板的特化版本和模板的泛化版本都应该放在同一个 .h 文件中。.h 文件中前面放泛化版本,后面放特化版本。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。