模板定义:模板就是实现代码重用机制的一种工具。它能够实现类型參数化,即把类型定义为參数。 从而实现了真正的代码可重用性。
模版能够分为两类。一个是函数模版,另外一个是类模版。
1、 函数模板
函数模板的一般形式例如以下:
Template <class或者也能够用typename T>
返回类型 函数名(形參表)
{//函数定义体 }
说明:
(1)template是一个声明模板的keyword,表示声明一个模板keyword。
(2)<>里面的是模板參数。class和typename不能省略,每一个形參前都要加class 或typename。
代码例如以下:
//Test.cpp #include <iostream> using std::cout; using std::endl; //声明一个函数模版,用来比較输入的两个同样数据类型的參数的大小。class也能够被typename取代, //T能够被不论什么字母或者数字取代。template <class T> T min(T x,T y) { return(x<y)?x:y;} void main( ) { int n1=2,n2=10; double d1=1.5,d2=5.6; cout<< "较小整数:"<<min(n1,n2)<<endl; cout<< "较小实数:"<<min(d1,d2)<<endl; system("PAUSE"); }
2、类模板
定义一个类模板:
Template < class或者也能够用typename T >
class类名{
//类定义......
}。
说明:
(1)template是声明各模板的keyword,表示声明一个模板,
(2)<>里是模板參数。模板參数能够是一个,也能够是多个。
代码例如以下:
#ifndef ClassTemplate_HH
#define ClassTemplate_HH
template<typename T1,typename T2>
class myClass{
private:
T1 I;
T2 J;
public:
myClass(T1 a, T2 b);//Constructor
void show();
};
//这是构造函数
//注意这些格式
template <typename T1,typename T2>
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b){}
//这是void show();
template <typename T1,typename T2>
void myClass<T1,T2>::show()
{
cout<<"I="<<I<<", J="<<J<<endl;
}
#endif// Test.cpp
#include <iostream>
#include "ClassTemplate.h"
using std::cout;
using std::endl;
void main()
{
myClass<int,int> class1(3,5);
class1.show();
myClass<int,char> class2(3,'a');
class2.show();
myClass<double,int> class3(2.9,10);
class3.show();
system("PAUSE");
}非类型模版參数
一般来说。非类型模板參数能够是常整数(包含枚举)或者指向外部链接对象的指针。
那么就是说。浮点数是不行的。指向内部链接对象的指针是不行的。
template<typename T, int MAXSIZE>
class Stack{
Private:
T elems[MAXSIZE];
…
};
Int main()
{
Stack<int, 20> int20Stack;
Stack<int, 40> int40Stack;
…
};