C++類模板

一、定義

(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

 

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章