1 模板类入门
#include<iostream> using namespace std; template<class T1,class T2> class MyClass { private: T1 a; T2 b; public: MyClass(T1 a1,T2 b1):a(a1),b(b1){} void display(); }; template<class T1,class T2> void MyClass<T1,T2>::display() { cout<<a<<endl; cout<<b<<endl; } int main() { int a=100; double b=200.333; MyClass<int,double> obj(a,b); obj.display(); return 0; }
运行结果:
100
200.333
2 为具体类型的参数提供默认值
#include<iostream> using namespace std; template<class T1,class T2,int num=10> class MyClass { T1 a; T2 b; public: MyClass(T1 a1,T2 b1) { a=a1+num; b=b1+num; } void display() { cout<<a<<endl; cout<<b<<endl; } }; int main() { int a=100; double b=200.333; //具体类型使用默认参数 MyClass<int,double> obj(a,b); obj.display(); //具体类型不使用默认参数 MyClass<int,double,100> obj2(a,b); obj2.display(); return 0; }
运行结果:
110
210.333
200
300.333
3 为具体类型的参数提供默认类型
#include<iostream> using namespace std; template<class T1,class T2=int> class MyClass { T1 a; T2 b; public: MyClass(T1 a1,T2 b1) { a=a1; b=b1; } void display() { cout<<a<<endl; cout<<b<<endl; } }; int main() { int a=100; double b=200.333; //具体类型使用默认类型 MyClass<int> obj(a,b); obj.display(); //具体类型不使用默认类型 MyClass<int,double> obj2(a,b); obj2.display(); return 0; }
运行结果:
100
200
100
200.333
4 定制类模板:针对特定类型的类
#include<iostream> using namespace std; //自定义的Date类,重载了+和-运算,并定义了输出方法display class Date { public: Date(){} Date(int y,int m,int d):year(y),month(m),day(d){} ~Date(){} void display() { cout<<year<<"-"<<month<<"-"<<day<<endl; } Date& operator + (const int); Date& operator = (const Date&); private: int year; int month; int day; }; Date& Date::operator + (const int add) { this->day+=add; return *this; } Date& Date::operator = (const Date& date) { year=date.year; month=date.month; day=date.day; return *this; } /////////////////////下面是定制类模板的例子//////////////////////// template<class T1> class MyClass1 { T1 a; public: MyClass1(T1 a1):a(a1) { } void display() { cout<<a<<endl; } }; //定制类模板,针对Date类型,因为Date类没有重载<<运算符 template<> class MyClass1<Date> { Date a; public: MyClass1(Date a1):a(a1) { } void display() { a.display(); } }; int main() { MyClass1<int> obj11(100); obj11.display(); MyClass1<Date> obj12(Date(1,1,1)); obj12.display(); return 0; }
运行结果:
100
1-1-1
5 定制成员函数 :针对特定类型的方法
template<class T2> class MyClass2 { T2 b; public: MyClass2(T2 b1):b(b1) { } void display(); }; template<class T2> void MyClass2<T2>::display() { cout<<b<<endl; } //定制类成员方法,因为Date类没有重载<<运算符 void MyClass2<Date>::display() { b.display(); } int main() { MyClass2<int> obj21(200); obj21.display(); MyClass2<Date> obj22(Date(2,2,2)); obj22.display(); return 0; }
运行结果:
200
2-2-2
6 部分定制类模板
template<class T1,class T2> class MyClass3 { private: T1 a; T2 b; public: MyClass3(T1 a1,T2 b1):a(a1),b(b1){} void display(); }; template<class T1,class T2> void MyClass3<T1,T2>::display() { cout<<a<<endl; cout<<b<<endl; } //部分定制 template<class T1> class MyClass3<T1,double> { private: T1 a; double b; public: MyClass3(T1 a1,double b1):a(a1),b(b1){} void display(); }; template<class T1> void MyClass3<T1,double>::display() { cout<<a-10<<endl; cout<<b-20<<endl; } int main() { MyClass3<int,int> obj31(100,100); obj31.display(); MyClass3<int,double> obj32(100,100.00); obj32.display(); return 0; }
运行结果:
100
100
90
80