小解C++模板特化

模板的特化(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,char
t2)//函数模板特化

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的IsEqual进行两个字符串比较,显然这里存在的问题和上面函数模板中的一样,我们需要比较两个字符串的内容,而不是仅仅比较两个字符指针。因此,需要使用类模板的特化:1template<>classcompare<char
>//特化(char)

2{

3public:

4boolIsEqual(char
t1,char*t2)

5{

6returnstrcmp(t1, t2)==0;//使用strcmp比较字符串

7}

8};注意:进行类模板的特化时,需要特化所有的成员变量及成员函数。原文链接: https://www.cnblogs.com/hicjiajia/archive/2010/08/27/1810372.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14380

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午1:56
下一篇 2023年2月7日 下午1:59

相关推荐