C++ 模板(一)
C++模板类似与C#/Java当中的泛型,即可使用同样的代码实现不同的功能。效果类似于继承(父对象指针指向子指针)。
一 : 函数模板
#include<iostream>usingnamespacestd;template<typenameT>//<typenameT>==<classT>voidprint(Ta){cout<<a<<endl;}intmain(){print('a');print(1);return0;}
结果:
解析:
① template<typename T> 或者 template<class T>对函数print函数进行注册模板。
② 注意如果注册了泛型T , 那么测函数一定要用到T。
③ template<typename T>的作用域是这一整个函数。
④ 模板比重载要好用。
模板的具体化:当模板中有些情况需要具体处理的处理时(特殊处理)
#include<iostream>usingnamespacestd;structNote{inta;intb;};template<typenameT>//<typenameT>==<classT>voidprint(Ta){cout<<a<<endl;}//具体化特殊情况template<>voidprint<Note>(Notea){cout<<"具体化Note:"<<a.a<<endl;}intmain(){Notec;c.a=10;print(c);return0;}
运行结果:
解析:
① 直接打印Note的话绝对是会报错的 , 这样必须对Note的打印进行具体化
② 具体化的格式 : template<> void print<Note>(Note a)
③ 可以看出来template<typename T>void print( T a )根本就没有执行,执行的是具体化的template<> void print<Note>(Note a),实际上如果有普通函数
void print(Note a ) , 则执行普通函数。 普通函数 > 具体化 > 模板
模板的实例化:
#include<iostream>usingnamespacestd;structNote{inta;intb;};template<typenameT>//<typenameT>==<classT>voidprint(Ta){cout<<a<<endl;}//具体化特殊情况template<>voidprint<Note>(Notea){cout<<"具体化Note:"<<a.a<<endl;}//实例化double类型templatevoidprint<double>(doublea);intmain(){Notec;c.a=10;print(c);return0;}
->template void print<double>(double a);
如果没有调用print(12.12)( print(double))可以先实例化double,以后调用的话快一点,其余作用没有。
二:类模板
#include<iostream>usingnamespacestd;template<typenameT=char>//如果是类模板,是可以加默认值的T=charclassCPeople{public:Ta;CPeople(Ta){this->a=a;}voidprint(){cout<<a<<endl;}};intmain(){CPeople<int>c_1(12);c_1.print();CPeople<>c_2('k');//因为默认泛型为char,所以可以不写char但是<>一定要带上c_2.print();CPeople<double>*c_3=newCPeople<double>(12.5);c_3->print();deletec_3;return0;}
结果:
解析:
① template<typename T = char> 默认值在函数模板是不允许的。另外默认值和参数列表是一样的,从右向左,不能 template<typename T = char,typename Y>只能template<typename T,typename Y=char>
类内定义 , 类外实现函数:
#include<iostream>usingnamespacestd;template<typenameT=char>//如果是类模板,是可以加默认值的T=charclassCPeople{public:Ta;CPeople(Ta){this->a=a;}voidprint();};template<typenameT>voidCPeople<T>::print(){cout<<a<<endl;}intmain(){CPeople<int>c_1(12);c_1.print();CPeople<>c_2('k');//因为默认泛型为char,所以可以不写char但是<>一定要带上c_2.print();CPeople<double>*c_3=newCPeople<double>(12.5);c_3->print();deletec_3;return0;}
注意函数模板不能用默认泛型
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。