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
在函数签名中不使用函数模板的每个类型参数属于语法错误。