模板
模板(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替换为intlong l=-12345L;cout <<abs(l)<<endl; //类型参数T替换为longfloat 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();}
联系客服