C++类模板的特化

来源:互联网 发布:sql删除嵌套select 编辑:程序博客网 时间:2024/04/27 14:56

C++类模板的特化分为两种,一种是全特化,另一种是偏特化。
下面这个例子就是全特化

#include<iostream>using namespace std;template<class T>class SeqList{public:    SeqList();    ~SeqList();private:    int _size;    int _capacity;    T* _data;};template<class T>SeqList<T>::SeqList():_size(0), _capacity(0), _data(new T[_capacity]){    cout << "SeqList<T>" << endl;}template<class T>SeqList<T>::~SeqList(){    delete[] _data;}template<>class SeqList<int>{public:    SeqList(int capacity);    ~SeqList();private:    int _size;    int _capacity;    int* _data;};//特化后定义成员函数不再需要模板形参SeqList<int>::SeqList(int capacity):_size(0), _capacity(0), _data(new int[_capacity]){    cout << "SeqList<int>" << endl;}SeqList<int>::~SeqList(){    delete[] _data;}void test1(){    SeqList<double>s1;    SeqList<int>s2(2);}int main(){    test1();    system("pause");    return 0;}

执行结果

下面这个例子是偏特化

#include<iostream>using namespace std;template<class T1,class T2>class Data{public:    Data();private:    T1 _d1;    T2 _d2;};template<class T1,class T2>Data<T1, T2>::Data(){    cout << "Data<T1, T2>" << endl;}//偏特化第二个参数template<class T1>class Data<T1,int> {public:    Data();private:    T1 _d1;    int _d2;};template<class T1>Data<T1, int>::Data(){    cout << "Data<T1,int>" << endl;}void test1(){    Data<int, char> s1;    Data<int, int> s2;}int main(){    test1();    system("pause");    return 0;}

这里写图片描述

template<class T1,class T2>class Data{public:    Data();private:    T1 _d1;    T2 _d2;};template<class T1,class T2>Data<T1, T2>::Data(){    cout << "Data<T1, T2>" << endl;}//局部特化两个参数为指针类型template<class T1, class T2>class Data<T1*, T2*>{public:    Data();private:    T1* _d1;    T2* _d2;};template<class T1, class T2>Data<T1*, T2*>::Data(){    cout << "Data<T1*,T2*>" << endl;}void test1(){    Data<int*, char*> d1;}//局部特化两个参数为引用template<class T1, class T2>class Data<T1&, T2&>{public:    Data(const T1& d1, const T2& d2);private:    const T1& _d1;    const T2& _d2;};template<class T1, class T2>Data<T1&, T2&>::Data(const T1& d1, const T2& d2):_d1(d1), _d2(d2){    cout << "Data<T1&,T2&>" << endl;}void test2(){    Data<int&, int&>d3(4,5);}int main(){    test1();    test2();    system("pause");    return 0;}

这里写图片描述

由上面特化成指针和引用可以看出偏特化并不仅仅是特殊部分参数,而是针对模板参数更进一步的条件限制所设计出的一个特化版本。
由上面的全特化和偏特化可以看出,每次特化前都必须是在已定义的模板基础之上,特化不能单独存在。

0 0
原创粉丝点击