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

 

参考:

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