七. 为什么不模版特化?

看了Exception c++style 感觉受益非浅,推荐大家看这本书!

一些符号显示不出来,忘谅解。以下仅为个人愚见,欢迎指证!

 

1 为什么用模版?

一句话:模版提供了编译时的多态性,而且它是C++ Standard lib 中重要的组成部分。

2 模版有哪些?

函数模版 、类模版

3 模版特化是什么?

即对主模版的特殊定义

4 怎样来特化模版?

template<class T> void Func(T val);  //函数主模版

template<> void Func<int>(int val);  //函数特化模版

 

template<class T> class A{T a;};   // 类主模版

template<> class A<int> {int a;};  //类偏特化模版

5 编译器选择调用函数版本顺序

函数模版选择比较复杂,原文有些晦涩。我总结了下,按照优先级来排:

P1:非函数模版

P2:主模版

       P21:特化版本

       P22:非特化版本

每个级别中又分别按照参数匹配最优的原则进行函数匹配。

举例:

template<class T> void Func(T);

template<> void Func<int*>(int *);

template<class T> void Func(T*);

int *p;

Func(p);   

会调用哪个???

答案是第3个!。

 6 函数模版特化原则

1)尽量不要对已经重载的函数模版进行特化,因为特化版本不会影响重载决议。

2)如果一个主模版的却需要特化,那么请这样做:

template<class T> class Flmpl;

template<class T> void Func(T t) {Flmpl<T>::f(t);} // 主模版不要动

template<class T> class Flmpl { public: static void f(T t); } // 特化模版实现以静态函数方式封装在这个类中。

 

template<> void Flmpl<int>::f(int t) { }//特化了

 

Func(2); // 调用类中的特化函数集合

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值