打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
C 模板特化与偏特化

(给CPP开发者加星标,提升C/C++技能)

来源:M_jianjianjiao
https://blog.csdn.net/M_jianjianjiao/article/details/85220983
函数的特化

使用模板时会遇到一些特殊的类型需要特殊处理,不能直接使用当前的模板函数,所以此时我们就需要对该类型特化出一个模板函数(就是写出一个模板函数专门给该类型使用)

当使用一个判断相等的模板函数时

template<class T>bool Isequal(T& p1, T& p2){ return p1 == p2;}

但是该模板函数在对于字符串进行比较时就不能使用了,对于字符串我们不能直接比较,因此直接特化出一个专门供字符串使用的模板参数

template<> // 此处不添加类型模板,直接使用空即可bool Isequal<char*>(char*& p1, char*& p2){ return strcmp(p1, p2) == 0;}

【注意】

使用模板特化时,必须要先有基础的模板函数(就是上面第一个模板函数)

使用特换模板函数时格式有要求:

1.template 后直接跟<> 里面不用写类型

2.函数名<特化类型>(特化类型 参数1, 特化类型 参数2 , …) 在函数名后跟<>其中写要特化的类型

特化的函数的函数名,参数列表要和原基础的模板函数相相同,避免不必要的错误

在实际使用中,为了实现简单,对于一些模板函数处理有问题的特殊类型,我们将其直接写出
bool Isequal(char*& p1, char*& p2){ cout << 'char2' << endl; return strcmp(p1, p2) == 0;}

当有可以直接匹配的函数时,即使有特化出的函数,都优先使用直接匹配的函数


类的模板特化

类的模板特化分为两种,一种是全特化,一种为偏特化

全特化:即将所有的模板类型都进行特化

template <class T1, class T2>class Test{}
//全特化template <> //此处同函数模板的特化一样不用写内容class Test<int , char>{ }

偏特化:对于模板的类型做一些限制

偏特化分为两种 一种是部分特化,一种是对于模板类型的进一步限制

部分特化:就是只对函数模板的一部分模板类型进行特化

template <class T1, class T2>class Test2{}
//部分特化template <class T1> //此处只需写未进行特化的模板类型,特化过的就不用写class Test2<T1 , char>{ }

对类型的范围的限制,主要的类型基础不变

template <class T1, class T2>class Test2{}
//对模板类型的范围做出一定的限制template <class T1 , class T2 > //此处只需写未进行特化的模板类型class Test2<T1* , T2*>{}

在调用时都将调用与自己的类型最相匹配的。

- EOF -

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
(C 模板类)
类模板(原创) - c++探索 - C++博客
模板的全特化与偏特化
解读C 编程中类模板的三种特化
boost源码剖析之:泛型编程精灵type_traits
C++模板编程里的主版本模板类、全特化、偏特化(C++ Type Traits)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服