模板的特化(template specialization)分为两类:函数模板的特化和类模板的特化。
(1)函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。例如:1boolIsEqual(T t1, T t2)
2{
3returnt1==t2;
4}
5
6intmain()
7{
8charstr1[]="Hello";
9charstr2[]="Hello";
10cout<<IsEqual(1,1)<<endl;
11cout<<IsEqual(str1, str2)<<endl;//输出0
12return0;
13}代码11行比较字符串是否相等。由于对于传入的参数是char 类型的,max函数模板只是简单的比较了传入参数的值,即两个指针是否相等,因此这里打印0。显然,这与我们的初衷不符。因此,max函数模板需要对char 类型进行特别处理,即特化:1template<>boolIsEqual(chart1,chart2)//函数模板特化
2{
3returnstrcmp(t1, t2)==0;
4}这样,当IsEqual函数的参数类型为char 时,就会调用IsEqual特化的版本,而不会再由函数模板实例化。
(2)类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。例如:1template<classT>
2classcompare
3{
4public:
5boolIsEqual(T t1, T t2)
6{
7returnt1==t2;
8}
9};
10
11intmain()
12{
13charstr1[]="Hello";
14charstr2[]="Hello";
15compare<int>c1;
16compare<char>c2;
17cout<<c1.IsEqual(1,1)<<endl;//比较两个int类型的参数
18cout<<c2.IsEqual(str1, str2)<<endl;//比较两个char 类型的参数
19return0;
20}这里代码18行也是调用模板类compare
2{
3public:
4boolIsEqual(chart1,char*t2)
5{
6returnstrcmp(t1, t2)==0;//使用strcmp比较字符串
7}
8};注意:进行类模板的特化时,需要特化所有的成员变量及成员函数。
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14380
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!