学科分类
目录
C++基础

定义一个函数模板

函数模板并不是一个可以直接使用的函数,它是可以产生多个函数的模板,假如我们定义一个求两个数相加的函数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)这样的调用,直接将类型传入。

点击此处
隐藏目录