模板&泛型编程

如何编写一个通用加法函数?
使用函数重载,针对每个所需相同行为的不同类型重新实现它
【缺点】
1、只要有新类型出现,就要重新添加对应函数。
2、除类型外,所有函数的函数体都相同,代码的复用率不高
3、如果函数只是返回值类型不同,函数重载不能解决
4、一个方法有问题,所有的方法都有问题,不好维护
使用公共基类,将通用的代码放在公共的基础类里面
【缺点】
1、借助公共基类来编写通用代码,将失去类型检查的优点
2、对于以后实现的许多类,都必须继承自某个特定的基类,代码维护更加困难
使用特殊的预处理程序
【缺点】
不是函数,不进行参数类型检测,安全性不高
还有什么办法呢?
泛型编程
泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础。
函数模板
函数模板:代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的 特定类型版本。
注意:模板被编译了两次:
实例化之前,检查模板代码本身,查看是否出现语法错误,如:遗漏分号 在实例化期间,检查模板代码,查看是否所有的调用都有效,如:实例化类型不支持某些函数调 用
【实参推演】 从函数实参确定模板形参类型和值的过程称为模板实参推断 多个类型形参的实参必须完全匹配
【类型形参转换】 一般不会转换实参以匹配已有的实例化,相反会产生新的实例。 编译器只会执行两种转换:
1、const转换:接收const引用或者const指针的函数可以分别用非const对象的引用或者指针来调用
2、数组或函数到指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应用常规指 针转换。数组实参将当做指向其第一个元素的指针,函数实参当做指向函数类型的指针。
模板形参说明
1、模板形参表使用<>括起来
2、和函数参数表一样,跟多个参数时必须用逗号隔开,类型可以相同也可以不相同
3、定义模板函数时模板形参表不能为空
4、模板形参可以是类型形参,也可以是非类型新参,类型形参跟在class和typename后
5、模板类型形参可作为类型说明符用在模板中的任何地方,与内置类型或自定义类型 使用方法完全相同,可用于指定函数形参类型、返回值、局部变量和强制类型转换
【模板函数重载】
注意:函数的所有重载版本的声明都应该位于该函数被调用位置之前。
【说明】
1、一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例 化为这个非模板函数。
3、显式指定一个空的模板实参列表,该语法告诉编译器只有模板才能来匹配这个调用, 而且所有的模板参数都应该根据实参演绎出来。 4、模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。
【模板函数特化】 有时候并不总是能够写出对所有可能被实例化的类型都合适的模板,在某些情况下,通用模板定 义对于某个类型可能是完全错误的,或者不能编译,或者做一些错误的事情。
模板函数特化形式如下:
1、关键字template后面接一对空的尖括号<>
2、函数名后接模板名和一对尖括号,尖括号中指定这个特化定义的模板形参 3、函数形参表 4、函数体

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值