函数模板
函数模板,实质上建立一个通用函数,其函数类型和形参不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只需在模板中定义一次即可。
#include <iostream>
using namespace std;
template <typename T> // 模板声明,其中 T为类型参数
T max(T a, T b, T c) {
if (b > a) a = b;
if (c > a) a = c;
return a;
}
int main() {
int i1 = 180, i2 = -76, i3 = 567, i;
double d1 = 56.72, d2 = 90.23, d3 = -3214.78, d;
long g1 = 67854, g2 = -912456, g3 = 673456, g;
i = max(i1, i2, i3); // 调用模板函数,此时 T被 int 取代
d = max(d1, d2, d3); // 调用模板函数,T被 double 取代
g = max(g1, g2, g3);
return 0;
}
定义函数莫半年的一般形式为:
template <typename T> 或 template<class T>
尖括号中先写关键字 typename(或 class),后面跟一个 i 跟一个类型参数 T,这个类型参数实际上是一个虚拟的类型名,表示模板出现的 T 是一个类型名,但是现在并未指定它是一个具体的类型。其实也可以不用 T 而用任何一个标识符,许多人习惯用 T(T是 Type 的第一个字母)。
class 和 typename的作用相同,都表示类型名,二者可以互换。typename 是之后才被加到 C++标准中的,因为 class 容易与 C++中的类混淆。
函数模板只适用于函数体相同、函数的参数个数相同而类型不同的情况,如果参数的个数不同,则不能用函数模板。