编写程序:
运行结果:
程序分析:
程序第3~8行是定义模板。定义函数模板的一般形式为
template<typename T>
通用函数定义
或
template <class T>
通用函数定义
template的含义是"模板",尖括号中先写关键字typename(或class),后面跟一个类型参数T,这个类型参数实际上是一个虚拟的类型名,表示模板中出现的T是一个类型名,但是现在并未指定它是哪一种具体的类型。在函数定义时用T来定义变量a,b,c,显然变量a,b,c的类型也是未确定的。要等到函数调用时根据实参的数据类型来确定T是什么类型。其实也可以不用T而用任何一个标识符,许多人习惯用T(T是Type的第1个字母),而且用大写,以与实际的类型名相区别。
class和typename的作用相同,都是表示"类型名",二者可以互换。以前的C++程序员都用class。typename是不久前才被加到标准C++中的,因为用class容易与C++中的类混淆。而用typename的含义很清楚,是数据类型名(而不是类名)。
有些读者可能对模板中通用函数的表示方法不习惯,其实在建立函数模板时,用虚拟的数据类型名T代替具体的数据类型即可。在对程序进行编译时,遇到第13行调用函数max(i1,i2,i3),编译系统会将函数名max与函数模板max相匹配,将实参的类型代了函数模板中的虚拟类型T。此时相当于已定义了一个函数:
int max(int a,int b,int c)
{if(b>a)a=b;
if(c>a)a=c;
return a;
}
然后调用它。后面两行(14,15行)的情况类似。
类型参数可以不止一个,可以根据需要确定个数,如
template <class T1, typename T2>
可以看到,用函数模板比函数重载更方便,程序更简洁。但应注意它只适用于函数体相同、函数的参数个数相同而数据类型不同的情况,如果参数的个数不同,则不能用函数模板。