C++之类模板特化
C++之類模板特化
模板:
template<typename T1, typename T2> class example{ public:example();~example(); private:T1 data1;T2 data2;int data3; };template<typename T1, typename T2> example<T1, T2>::example():data1(1),data2(1),data3(1) {cout << "模板實例構造完成" << endl; }template<typename T1, typename T2> example<T1, T2>::~example() {cout << "模板實例析構完成" << endl; }全特化
全特化指的是在類模板的基礎上,再重新定義一個類,該類與類模板的內容完全一致,唯一的區別是指定了類模板的所有類型。
例如:
局部特化
類模板的局部特化有兩種方式,一種是指定部分模板參數;另一種是對全部的模板參數做出修飾。前者也稱為偏特化。
第一種:
template<typename T1> class example<T1, char> //這里指定第二個模板參數為char { public:example();~example(); private:T1 data1;char data2;int data3; };template<typename T1> //由于只指定了第二個模板參數的類型,所以這里還有給出模板形參T1 example<T1, char>::example():data1(3),data2(3),data3(3) {cout << "偏特化<T1, char>實例構造完成" <<endl; }template<typename T1> example<T1, char>::~example() {cout << "偏特化<T1, char>實例析構完成" <<endl; }第二種:
template<typename T1, typename T2> class example<T1 *, T2 *> //這里特化為兩模板參數為指針版本 { //當實例化對象時,若指定的模板參數為兩指針,則會通過此來進行實例化 public:example();~example(); private:T1 data1; //對于data1和data2而言,它們只關心實例化時傳入指針解引用后的類型T2 data2;int data3;T1 * data4; //對于data4和data5而言,它們關心實例化時傳入的指針T2 * data5; };template<typename T1, typename T2> //對于編譯器而言//模板的類型仍是未知的,所以需要給出T1、T2兩個模板參數 example<T1 *, T2 *>::example():data1(0),data2(0),data3(0),data4(&data1),data5(&data2) {cout << "構造<T1 *, T2 *>" << endl; }template<typename T1, typename T2> example<T1 *, T2 *>::~example() {cout << "析構<T1 *, T2 *>" << endl; }下面是對上面定義的幾個類的實例化:
int main() {example <int, char>ex1;example <char, char>ex2;example <int , int>ex3;example <char, int>ex4;example <int *, int *>ex5;return 0; }
在特化這里,無論是函數特化還是類特化,在調用或者實例化時都遵循“最特化”原則,即最特殊的那一個。
總結
- 上一篇: 易语言编程之CE过驱动保护(ACE)调试
- 下一篇: SCCM 2007 R2 setp by