C++ — 全特化和偏特化

来源:互联网 发布:php基本知识 编辑:程序博客网 时间:2024/06/05 09:59

                        全特化和偏特化





C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,

这一点在STL中有着充分的体现。目前,STL在C++社区中得到了广泛的关注、应用和研究。理解和掌握模板

学习、应用和研究以及扩充STL的基础。而STL模板实例中又充斥着大量的模板特化和偏特化。


模板特化分为两种:                          全特化和偏特化


首先我们得先明白一个问题,为什么会有特化这种东西呢?

因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。


全特化:




那我们就用一个例子开始吧:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. template<class T>  
  2. class A  
  3. {  
  4. public:  
  5.     A()  
  6.     :a(0)  
  7.     {}  
  8.     ~A()  
  9.     {  
  10.         cout << "这里走了原始的模板"<< endl;  
  11.     }  
  12. protected:  
  13.     T a;  
  14. };  
  15.   
  16. template<>  
  17. class A<int>  
  18. {  
  19. public:  
  20.     A()  
  21.     :a(0)  
  22.     {}  
  23.     ~A()  
  24.     {  
  25.         cout << "这里走了全特化后int的版本" << endl;  
  26.     }  
  27. protected:  
  28.     int a;  
  29. };  
  30.   
  31. void test2()  
  32. {  
  33.     A<char> a;  
  34.     A<int> b;  
  35. }  

我们先看看程序运行的结果:



我们通过析构函数发现了,A<int> b 走的是我们特化的版本。 而A<char> a走的是原始版本。

这就是全特化,我们对模板的所有参数进行了特化。

下面是我调试时实例化b的时候,发生的事情,程序走的是int类型特化版本,有图有真相:



偏特化:


所谓的偏特化也称局部特化,大家大概明白什么回事了吧。 全特化是所有的模板参数都被进行特化

,偏特化也就是局部的参数特化,看看下面这个例子吧:


template <typename T1, typename T2>class Data{public:Data();private:T1 _d1;T2 _d2;};template <typename T1, typename T2>Data<T1, T2>::Data(){cout << "Data<T1, T2>" << endl;}// 局部特化第二个参数template <typename T1>class Data <T1, int>{public:Data();private:T1 _d1;int _d2;};template <typename T1>Data<T1, int>::Data(){cout << "Data<T1, int>" << endl;}void test2(){Data<double, int> d1;Data<int, double> d2;}int main(){test2();system("pause");return 0;}

我们观察输出的结果:




我画一张图帮我们理解吧:





下面我再举个例子,你们说说他是偏特化还是全特化:



// 局部特化两个参数为指针类型template <typename T1, typename T2>class Data <T1*, T2*>{public :     Data();private :     T1 _d1 ;     T2 _d2 ;     T1* _d3 ;     T2* _d4 ;};template <typename T1, typename T2>Data<T1 *, T2*>:: Data(){     cout<<"Data<T1*, T2*>" <<endl;}// 局部特化两个参数为引用template <typename T1, typename T2>class Data <T1&, T2&>{public :     Data(const T1& d1, const T2& d2);private :     const T1 & _d1;     const T2 & _d2;     T1* _d3 ;     T2* _d4 ;};template <typename T1, typename T2>Data<T1 &, T2&>:: Data(const T1& d1, const T2& d2)             : _d1(d1 )             , _d2(d2 ){     cout<<"Data<T1&, T2&>" <<endl;}



记住这些都是偏特化,这里就要再引出一个概念,偏特化并不仅仅是指特殊部分参数,而是针对模板参数更

进一步的条件限制所设计出来的一个特化版本


最后我在说一个注意事项:   模板的全特化和偏特化都是在已经定义的模板基础之上的,不能单独存在。








1 1
原创粉丝点击