1.为什么要引入函数模板?
通过下图中三个函数可以看到除了数据类型不同以外,它们的运算逻辑是完全相同的,如果一一写出这三个函数意义不大,浪费时间,这个时候有没有一种方案:将类型作为参数传递进去,让计算机根据不同的参数,即不同的类型产生相应的函数,这样通过产生的三个函数就可以分别处理int float char 三个类型的数据了,并取得到相应类型的返回值,我们就省了好多代码。这就需要引入函数模板。
因此函数模板说白了就是函数的参数不固定成一种数据类型,可以根据函数的调用按需要传入任意类型的值
2.模板关键字
不管是类模板还是函数模板都会用到的三个关键字:template typename class
注意:其中typename和class的作用是相同的,用来指明数据类型T,这里的class不是类的意思,也是用来指明数据类型。
3.函数模板的形式
(1)用class关键字
如下图所示,函数模板的形式是:
使用template声明是一个模板,通过<class T>或者<typename T>来声明参数的类型。函数模板就相当于模具,根据模具产生的具体的函数(函数参数类型已固定)称为模板函数。
在计算机当中,如果我们仅仅写出了函数模板而不使用它,是不会产生任何代码数据的,因为它也不知道要产生什么样的代码数据。只有当我们去使用函数模板的时候,计算机才知道具体要实例化出怎样的一个模板函数来,这个时候才会产生真正的代码,才会参与逻辑的运行。
最后注意调用有两种形式:第一种直接传入整型的值,不显示指定模板参数的类型,那么系统会默认认为T的类型为int;第二种显示的指定模板参数的类型,指定方式是函数名<类型名称>(实参列表),如下图所示,注意一旦指定模板参数的类型,实参列表里面的数值必须是指定类型的,下图中必须是char型的,否则会报错。
(2)用typename关键字
注意交换数据的时候参数传递的是引用。
(3)变量作为模板的参数
给模板传入的不再是类型,而是一个变量,真正使用的时候传入的是一个常量,如下图所示
(4)多参数函数模板
注意多个参数之间用逗号隔开,且两个typename都不能省略。
注意:多参数函数模板,多个参数组合非常灵活:
1)typename和class关键字作用相同,在使用时时等价的,因此可以混用;
2)类型和变量也可以混用:
4.函数模板与函数重载的关系
同一个函数模板产生的所有的模板函数都是互为重载的,因为它们只有参数类型不同而已
而不同的函数模板产生的模板函数也有可能构成重载,如下所示:
这三个函数模板产生的模板函数互为重载: