看了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); // 调用类中的特化函数集合