一、定義
(1)類模板通常應用於數據結構方面,使得類的實現不在關注數據元素的具體類型,而只關注需要實現的功能
比如: 數組類,鏈表類,Queue類,Stack類等
(2)類模板和函數模板一樣,定義和實現必須都在頭文件中
(3)類模板中的成員函數可以在類外進行實現,但是必須加上template<typename T>的聲明,以及模板類型的聲明
template<typename T>
class MyOperator
{
T OperatorAdd(T objT1, T objT2)
{
return objT1 + objT2;
}
T OperatorSub(T objT1, T objT2);
};
template<typename T>
T MyOperator<T>::OperatorSub(T objT1, T objT2)
{
return objT1 - objT2;
}
二、使用
類模板定義對象時,必須制定類模板類型,否則編譯器無法推導其類型
MyOperator<int> a;
a.OperatorAdd(10,20);
三、類模板特化
(1)類模板特化和模板函數重載類似,表示可以存在多個相同的類名,但是模板類型不一樣
(2)類模板特化分爲完全特化和部分特化
(3)完全特化表示顯示制定類型參數,模板聲明只需寫成template<>,並在類名右側制定參數。
(4)部分特化表示通過特定規則約束類型參數
#include <iostream>
using namespace std;
template < typename T1,typename T2 >
class Operator //正常的類模板
{
public:
void add(T1 a, T2 b)
{
cout<<"add(T1 a, T2 b)"<<endl;
cout<<a+b<<endl;
}
};
template < typename T >
class Operator<T,T> //部分特化的類模板,當兩個參數都一樣,調用這個
{
public:
void add(T a, T b)
{
cout<<"add(T a, T b)"<<endl;
cout<<a+b<<endl;
}
};
template < typename T1,typename T2 >
class Operator<T1*,T2*> //部分特化的類模板,當兩個參數都是指針,調用這個
{
public:
void add(T1* a, T2* b)
{
cout<<"add(T1* a, T2* b)"<<endl;
cout<<*a+*b<<endl;
}
};
template < >
class Operator<void*,void*> //完全特化的類模板,當兩個參數都是void*,調用這個
{
public:
void add(void* a, void* b)
{
cout<<"add(void* a, void* b)"<<endl;
cout<<"add void* Error"<<endl; //void*無法進行加法
}
};
int main()
{
int *p1 = new int(1);
float *p2 = new float(1.25);
Operator<int,float> Op1; //匹配正常的類模板:class Operator
Op1.add(1,1.5);
Operator<int,int> Op2; //匹配部分特化的類模板:class Operator<T,T>
Op2.add(1,4);
Operator<int*,float*> Op3; //匹配部分特化的類模板:class Operator<T1*,T2*>
Op3.add(p1,p2);
Operator<void*,void*> Op4; //匹配完全特化的類模板:class Operator<void*,void*>
Op4.add(NULL,NULL);
delete p1;
delete p2;
return 0;
}
運行:
add(T1 a, T2 b)
2.5
add(T a, T b)
add(T1* a, T2* b)
2.25
add(void* a, void* b)
add void* Error
四、數值型模板參數
模板參數不僅都是帶泛型的(表示不同類型),還可以是數值型參數,數值型模板參數必須在編譯時被唯一確定,變量在運行期間是可變的,所以不能作爲模板參數.以及浮點數(不精確),類對象(可變)等等。
例子:通過數值參數的類模板來求 1+2+3+...+N的值
template < int N >
class Sum
{
public:
static const int VALUE = Sum<N-1>::VALUE + N; //定義靜態常量並賦值
};
template < >
class Sum < 1 >
{
public:
static const int VALUE = 1;
};
int main()
{
cout << "1 + 2 + 3 + ... + 10 = " << Sum<10>::VALUE << endl;
cout << "1 + 2 + 3 + ... + 100 = " << Sum<100>::VALUE << endl;
return 0;
}
運行打印:
1 + 2 + 3 + ... + 10 = 55
1 + 2 + 3 + ... + 100 = 5050
參考: