当前位置: 首页 > 文档资料 > C++大学教程 >

3.21 函数模板

优质
小牛编辑
130浏览
2023-12-01

重载函数通常用于不同数据类型用不同程序逻辑进行类似的操作。如果每种数据类型的程序逻辑和操作相同.那么用函数模板(fuction template)完成这项工作更加简洁和方便。程序员编写一个函数模板定义。根据函数调用中提供的参数类型,C++ 自动产生不同模板函数 (template function) 来处理不同类型的调用。这样,定义一个函数模板即可定义一系列的解决方案。

所有的函数模板定义都是以关键字template开头,之后是用尖括号(< >)括起来的形式参数表。每一个形式参数之前都有关键字class。形式参数是内部类型或用户自定义类型,指定函数的参数类型及返回类型,在函数定义体中声明变量,然后和任何其他函数中一样进行函数定义。

图3.27使用如下的函数模板定义:

template < class T >
T maximum{ T valuel, T value2, T value3 ){
T max = valuel;
if ( value2 > max )
max = value2;
if ( value3 > max )
max = value3;
return max;
}

这个函数模板声明一个形式参数T为函数maximum要测试的数据类型。编译器发现程序源代码中的 maximum 调用时,传人 maximum 的数据类型代替整个模板定义中的T,C++生成一个完整函数,确定三个指定数据类型值的最大值,然后编译新生成的函数。可以看出,模板就是一种代码产生工具。

图3.27中实例化三个函数:一个取三个int值,一个取三个double值,一个取三个char值。int类型的实例化如下所示:

int maximum(int valuel int value2, int value3 )
{
int max - valuel;
if ( value2 > max
max = value2;
if ( value3 > max
max = value3;
return max;
}

板定义中的每种参数都要在函数的参数表中至少出现一次。类型参数名在特定模板定义的形式参数表中必须惟一。

图3.27演示用maximum确定三个int值、三个double值和三个char值的最大值。

// Fig. 3.27: fig03_27.cpp
// Using a function template
include <iostream.h>
template < class T >
T maximum( T value1, T value2, T value3 ){
T max = valuel;
if( value2 > max )
if ( value3 > max )
max = value3;
return max;
}
int main(){
int intl, int2, int3;
cout << "Input three integer values: ";
cin >> i,tl >> int2 >> int3;
cout << "The maximum i.teger value is:"
<< maximum{ intl, int2, int3 ); // int version
double doublel, double2, double3;
cout << "\nInput three double values: ";
cin >> doublel >> double2 >> double3;
cout << "The maximum double value is:"
<< maximum( doublel, double2, double3 ); // double version
char charl, char2, char3;
cout << "\nInput three characters: ";
cin >> charl >> char2 >> char3;
cout << "The maximum character value is:"
<< maximum( charl, char2, char3 )   // char version
<< endl;
return 0;
}

输出结果:

Input three integer values: 1 2 3
The maximum integer value is: 3
Input three double values:3.3 2.2 1.1
The maximum double value is: 3.3
Input three characters: A C B
The maximum character value is: C

图 3.27 使用函数模板

常见编程错误3.35
函数模板中的每个类型参数前都要放上class关键字,否则属于语法错误。
常见编程错误3.36
在函数签名中不使用函数模板的每个类型参数属于语法错误。