泛型编程:函数模板的定义和使用,泛型编程函数的写法注意点

泛型编程:函数模板的定义和使用

定义一个函数模板的例子:

template <typename T>
T max(T const &a, T const &b)
{
 return a < b ? b : a;
}

这个模板指定了一个“返回两个值中的较大值”的函数家族。

注意:
一般的函数定义是声明或定义了一个函数,即指定了其中使用的数据类型,又指定了算法逻辑。
而函数模板则是一次声明或定义了一组“运行逻辑完全相同,数据类型不完全相同”的函数,没有指定数据类型,只指定了算法逻辑。

比较一下普通函数和函数模板的写法,会发现只是用参数类型替代了具体类型(int)而已:

int max(int const &a, int const &b)
{
 return a < b ? b :a;
}

1、在这个函数中的返回值和入参的数据类型都被定为int,和泛型编程的函数模板比较,函数模板的返回值和入参是没有被指定的,而是用类型参数T表示。
2、这里的类型参数T由template引入,引入的语句template后面不可以加分号。
3、一个template中的类型参数只作用于其后面紧跟的第一个函数,而不会在其他函数中发挥作用。
4、一个template对应其后面的一个函数,或者类,类型参数除了由typename声明,还可以用class声明,语法为template,typename关键字的出现晚于class,所以typaname还具有额外的功能,<>读作尖括号。

调用函数模板:

int ia = 10;
int ib = 20;
cout<<max(ia,ib)<<endl;
double doua = 10.123;
double doub = 20.123;
cout<<max(doua,doub)<<endl;
char cha = 'a';
char chb = 'b';
cout<<max(a,b)<<endl;

注意点:
1、语义上class和typename的使用是等价的,其声明的类型参数即可以判定基础类型如int,char,又可以判定容器类型如vector,string,也可以判定程序员的自定义类型。
2、泛型编程的数据类型是模糊的,其中的算法逻辑中定义的运算符调用和函数调用编译器不会在写代码阶段就判断出类型正确与否,函数是否存在等错误。
3、如果函数模板调用的某个类型不支持某个函数调用,比如+运算符,或者cout,但是函数模板中有该调用,就会在编译阶段报错,而不会在代码编写阶段就报错。

3、泛型编程只是减少了程序员的工作量,编译阶段编译器会将检测出的类型组合全部组合出相应的函数,例如前面的:

template <typename T>//template <class T>也可以
T max(T const &a, T const &b)
{
 return a < b ? b : a;
}

注意:
1、程序员写代码时定义了一个函数模板,调用时使用了哪些数据类型,编译器就会对应的生成几种函数,函数代码实际上在编译过程中进行了实例化,从函数模板实例化出了函数。类似于类实例化出对象。
2、等价于程序员手动编写了对应参数类型的函数,代码量是没变的,泛型编程引入的模板只是让程序员的工作量减少了。
3、调用一次函数模板,就会实例化一次函数,生成一个函数,编译器再次触发相同的数据类型时,按照调用函数的优先级会先调用普通函数,出现了不同类型的数据类型时,则再次实例化一次函数,以此类推,直到所有关于该函数模板的调用全部实例化成函数。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值