template之函数模版

函数模板//通用函数适用于不同数据类型
(1)所有函数模板的定义都是用关键字template开始的,该关键字之后是使用尖括号括起来的模板参数表。
下面以绝对值函数模板为例:
在这里插入图片描述
在编译过程中,有实参的类型来决定模板参数的类型。
在函数模板实例化的过程中,不能完成类型转换
比如:
template
void fun1(T x,T y)
{…}
此时 fun1(‘a’,‘b’)与fun1(1,2)都是可行的,但是对于这种调用fun1(‘a’,1)是不能执行的,因为在模板参数表中,两个参数的类型是相同的,而函数模板中的参数列表不能完成类型转换。
(2)函数模板之间及函数模板与特定函数之间都可以重载。至于哪一个会被调用,关键看那种更精确。
函数模板的重载可以通过模板参数表中参数个数的不同来控制。
下面举一个特定函数与函数模板重载的例子:
template//声明一个函数模板
void swap(T &x,T &y){
T tem;
tem=x;
x=y;
y=tem;}

void swap(int &x,int &y)//重载swap,定义一个特定函数
{int tem;
tem=x;
x=y;
y=tem;}
int a=1,b=2;double c=1.1,d=1.2;char e=‘a’,f=‘a’;
swap(a,b)//调用特定函数,因为更简便
swap(c,d);swap(e,f)//调用模板,因为调用特定函数时需要隐式转换,教麻烦。
swap(a,e)//调用特定函数,e会转换为int型。
关于调用原则总结下:
1如果某一普通函数的形参正好与函数调用的形参类型匹配,则优先调用该函数。
2如果不存在1中的函数,而从同名的类属函数实例化一个函数,且类型匹配,则调用。
3如果存在形参不匹配的特定函数与不能实例化的模板,则调用特定函数,并进行隐式转换。

猜你喜欢

转载自blog.csdn.net/qq_44054750/article/details/84996517
今日推荐