
4.3 函数模板
函数模板提供了一种机制,使函数的返回值、参数类型能够被参数化,而函数体保持不变。这极大地增强了函数的灵活性。例如,编写一个函数,能够实现两个整数相加,返回值为整数;能够实现两个实数相加,返回值为实数……使用函数模板可以轻易地实现这样的一个函数。本节将详细介绍有关函数模板的相关知识。
4.3.1 定义和使用函数模板
C++语言提供了template关键字用于定义模板。下面以编写一个求和函数为例介绍如何使用template定义函数模板。

其中,template为关键字,表示定义一个模板(可以是函数模板或类模板,类模板将在第5章进行介绍)。尖括号<>表示模板参数。模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数。上述代码中定义的模板使用的是模板类型参数,模板类型参数使用关键字class或typedef开始(本例使用的是class,也可以使用typedef代替。在定义函数模板时,class与typedef关键字的作用是相同的),其后是一个用户定义的合法的标识符(本例为type,也可以是其他合法标识符)。模板非类型参数与普通参数定义相同,它通常为一个常数,如标识数组的长度。
在定义完函数模板后,需要在程序中调用函数模板。下面的代码演示了Sum函数模板的调用。

如果采用如下形式调用Sum函数模板,将会出现错误。

在上述代码中,为函数模板传递了两个类型不同的参数,编译器产生了歧义。如果用户在调用函数模板时显示标识模板类型,就不会出现错误了。例如:

下面再定义一个函数模板,实现获取数组元素的最大值。
【例4.26】 定义函数模板,获取数组元素的最大值。

上述代码定义了一个函数模板Max,其中模板参数使用了模板类型参数type和模板非类型参数len。下面的代码演示了函数模板Max的调用。

4.3.2 重载函数模板
函数可以重载,同样,函数模板也可以重载。下面的代码定义了两个重载的函数模板。
【例4.27】 定义重载的函数模板。(实例位置:资源包\TM\sl\4\13)

上述代码中定义了两个重载的函数模板Sum,第1个Sum函数模板实现了两个数的求和运算,第2个Sum函数模板实现了数组元素的求和运算。下面的代码演示了重载函数模板的调用。
【例4.28】 调用重载的函数模板。(实例位置:资源包\TM\sl\4\13)

执行上述代码,结果如图4.10所示。

图4.10 重载函数模板