C++ — 全特化和偏特化

全特化和偏特化





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;
}



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

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


最后我在说一个注意事项:   模板的全特化和偏特化都是在已经定义的模板基础之上的,不能单独存在。
  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值