定义一个函数模板
函数模板并不是一个可以直接使用的函数,它是可以产生多个函数的模板,假如我们定义一个求两个数相加的函数add(),要实现int、float、double等多种类型的数据相加,则要定义很多个函数,这样显然比较麻烦。而此时我们可以用函数模板来解决,使用模板的目的就是要让这些程序的实现与类型无关,比如定义一个函数模板add(),它既可以实现int类型数据相加,又可以实现double类型数据相加。要定义add()函数模板就要先学习函数模板的定义格式,定义函数模板的语法格式如下所示:
template<typename 形参名,typename 形参名...>
返回值类型 函数名(参数列表)
{
函数体;
}
上述语法格式中,template是声明模板的关键字,typename关键字可以用class关键字代替,在这里class和typename没有区别。<>中的参数称为模板形参,模板形参和函数形参很像,但模板形参不能为空。template下面就是定义的一个函数模板,它与普通的函数定义方式相同,只是参数列表中的数据类型要使用<>中的形参名。
为了让读者更加深刻的理解函数模板的定义与使用,接下来通过定义与使用add()函数模板的案例来演示函数模板的用法,具体代码如例1所示。
例1
1 #include <iostream>
2 using namespace std;
3 //定义函数模板
4 template<typename T>
5 T add(T t1, T t2)
6 {
7 return t1 + t2;
8 }
9 int main()
10 {
11 cout << add(1, 2) << endl; //传入int类型参数
12 cout << add(1.2, 3.4) << endl; //传入double类型参数
13 system("pause");
14 return 0;
15 }
运行结果如图1所示。
图1 例1运行结果
由图1所知,当调用add()函数传入int型参数1和2时,形参T被替换成int,得到结果为3;当传入double型参数1.2和3.4时,形参T被替换成double,得到结果为4.6。这就避免了为int型数据定义一个求和函数,再为double型函数定义一个求和函数,很好地实现了代码复用。
需要注意的是,对函数模板而言不存在add(int, int)这样的调用,不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行,即只能进行add(2,3)这样的调用,或者定义整型变量int a = 2, b = 3,再将a、b变量作为参数进行add(a,b)这样的调用,编译器会根据传入的实际参数2、3来推演出传入的是int类型参数,则T为int类型,而不能使用add(int,int)这样的调用,直接将类型传入。