### 定义和使用函数模板

C++语言提供了 template 关键字用于定义模板。下面以编写一个求和函数介绍如何使用 template 定义函数模板。

template <class type> //定义一个模板类型

type Sum(type xvar,type yvar) //定义函数模板

{

return xvar + yvar;

}

其中，template 为关键字，表示定义一个模板（可以是函数模板或类模板），尖括号<>表示模板参数，模板参数主要有两种，一种是模板类型参数，另一种是模板非类型参数。上述代码中定义的模板使用的模板类型参数，模板类型参数使用关键字 class 或 typedef 开始（本例使用的是 class，也可以使用 typedef 代替，在定义函数模板时 class 与 typedef 关键字的作用是相同的），其后是一个用户定义的合法的标识符，本例为 type，也可以是其他的合法标识符。模板非类型参数与普通参数定义相同，它通常为一个常数，例如，标识数组的长度。

在定义完函数模板之后，需要在程序中调用函数模板。下面的代码演示了 Sum 函数模板的调用。

int iret = Sum(10,20); //实现两个整数的相加

double dret = Sum(10.5,20.5); //实现两个实数的相加

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

int iret = Sum(10.5,20); //错误的调用

double dret = Sum(10,20.5); //错误的调用

上述代码中为函数模板传递了两个类型不同的参数，编译器产生了歧义。

说明：如果用户在调用函数模板时显式标识模板类型，就不会出现错误了。

例如：

int iret = Sum<int>(10.5,20); //正确地调用函数模板

double dret = Sum<double>(10,20.5); //正确地调用函数模板

下面再定义一个函数模板，实现获取数组元素的最大值。

示例，定义函数模板，获取数组元素的最大值。

template <class type,int len> //定义一个模板类型

type Max(type array[len]) //定义函数模板

{

type ret = array[0]; //定义一个变量

for(int i=1; i<len; i++) //遍历数组元素

{

ret = (ret > array[i])? ret : array[i]; //比较数组元素大小

}

return ret; //返回最大值

}

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

int array[5] = {1,2,3,4,5}; //定义一个整型数组

int iret = Max<int,5>(array); //调用函数模板 Max

double dset[3] = {10.5,11.2,9.8}; //定义实数数组

double dret = Max<double,3>(dset); //调用函数模板 Max