模板
模板(template)是一个将数据类型参化的工具,它提供了一种将代码与数据类相脱离的机制,即代码不受具体的数据类型的影响。模板分为函数模板和类模板两种。
(1)函数模板
函数模板是一种不说明某些参数的数据类型的函数。例如,下面定义了一个可对任何类型变量进行操作(求绝对值)的函数模板。
template <class T> //或写成:template <typename T>
T abs(T val)
{
return val<0 ? -val : val;
}
在函数模板被调用时,编译器根据实际参数的类型确定模板参数T的类型,并自动生成一个对应的函数,即模板函数。模板参数的类型不同,生成的模板函数也不同。
例 1 函数模板的定义和使用
#include <iostream.h>
template <class T> //定义模板
T abs(T val) //定义函数模板
{
return val<0 ? -val : val;
}
void main()
{
int i=100;
cout <<abs(i)<<endl; //类型参数T替换为int
long l=-12345L;
cout <<abs(l)<<endl; //类型参数T替换为long
float f=-125.78F;
cout <<abs(f)<<endl; //类型参数T替换为float
}
定义函数模板时也可以使用多个类型参数,这时每个类型参数前面都要加上关键字class或typename,其间用逗分隔,其形式如下所示。
template <class T1,class T2,class T3>
例 2 使用多个类型参数的函数模板
#include <iostream.h>
template <class T1,class T2>
T1 Max(T1 x,T2 y)
{
return x>y ? x: (T1)y;
}
void main()
{
int i=100;
float f=-125.78F;
cout <<Max(i,f)<<endl; //类型参数T1替换为int,T2替换为float
}
(2)类模板
使用多个类型参数的类模板
#include <iostream.h>
template <class T1,class T2> //使用2个类型参数
class MyTemClass //定义类模板
{
private:
T1 x;
T2 y;
public:
MyTemClass(T1 a,T2 b) { x=a;y=b; } //构造函数
void ShowMax() //输出最大的数据成员
{
cout <<"MaxMember="<<(x>y?x:y)<<endl;
}
};
void main()
{
int a=100;
float b=123.45F;
MyTemClass<int,float> mt(a,b); //声明类模板的对象
mt.ShowMax();
}