C++―全特化和偏特化
全特化和偏特化
C++中的模板分为类模板和函数模板,虽然它引进到C++标准中的时间不是很长,但是却得到了广泛的应用,
这一点在STL中有着充分的体现。目前,STL在C++社区中得到了广泛的关注、应用和研究。理解和掌握模板
学习、应用和研究以及扩充STL的基础。而STL模板实例中又充斥着大量的模板特化和偏特化。
模板特化分为两种:
全特化和偏特化
首先我们得先明白一个问题,为什么会有特化这种东西呢?
因为编译器认为,对于特定的类型,如果你能对某一功能更好的实现,那么就该听你的。
全特化:
那我们就用一个例子开始吧:
[cpp] view plain copy
-
template<class T>
-
class A
-
{
-
public:
-
A()
-
:a(0)
-
{}
-
~A()
-
{
-
cout << "这里走了原始的模板"<< endl;
-
}
-
protected:
-
T a;
-
};
-
template<>
-
class A<int>
-
{
-
public:
-
A()
-
:a(0)
-
{}
-
~A()
-
{
-
cout << "这里走了全特化后int的版本" << endl;
-
}
-
protected:
-
int a;
-
};
-
void test2()
-
{
-
A<char> a;
-
A<int> b;
-
}
我们先看看程序运行的结果:
我们通过析构函数发现了,A<int> b 走的是我们特化的版本。 而A<char> a走的是原始版本。
这就是全特化,我们对模板的所有参数进行了特化。如果你想学习C/C++可以来这个群,首先是三三零,中间是八五九,最后是七六六,里面有大量的学习资料可以下载。
下面是我调试时实例化b的时候,发生的事情,程序走的是int类型特化版本,有图有真相:
偏特化:
所谓的偏特化也称局部特化,大家大概明白什么回事了吧。 全特化是所有的模板参数都被进行特化
,偏特化也就是局部的参数特化,看看下面这个例子吧:
[cpp]?view plain copy print?
-
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;
-
}
我们观察输出的结果:
我画一张图帮我们理解吧:
下面我再举个例子,你们说说他是偏特化还是全特化:
[cpp]?view plain copy print?
-
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;
-
}
记住这些都是偏特化,这里就要再引出一个概念,偏特化并不仅仅是指特殊部分参数,而是针对模板参数更
进一步的条件限制所设计出来的一个特化版本。
最后我在说一个注意事项: 模板的全特化和偏特化都是在已经定义的模板基础之上的,不能单独存在。
最后更新:2017-05-10 16:31:20