Effective C++第七章模板与泛型编程 条款41-条款48

条款41.了解隐式接口与编译期多态

面向对象的三大特性之一多态是指的运行期多态,在程序运行期间确定对象调用哪一个虚函数。
编译期多态是对于模板参数而言,通过模板具现化和函数重载解析实现,以不同的模板参数具现化导致调用不同的函数。
像我们在类中定义的成员函数都是显示接口,而对于模板参数而言,接口是隐式的,以有效的表达式为基础。
总结:

  • 类和模板都支持接口和多态
  • 对于类而言接口是显示的,以函数签名(函数名称、参数类型、返回类型)为中心,多态是通过虚函数实现发生于运行期
  • 对于模板参数而言,接口是隐式的,以有效表达式为基础,通过对模板的具现化和函数重载解析实现发生于编译期

条款42.了解typename 的双重意义

总结:

  • 声明template参数时,前缀关键字class和typename可互换
  • 请使用关键字typename标识嵌套从属类型名称;但不得在基类列或成员初值列内以它作为base class修饰符

条款43.学习处理模板化基类内的名称

当模板像类一样发生派生类对基类的继承时,并不能像类的继承一样,派生类完全继承基类中的函数,因为这里涉及到模板参数的具现化,如下例子,编译器为了防止某种类型的基类中没有相应函数的定义,在下面调用基类的函数的过程中,出现编译不通过。

这里是引用
在这里插入图片描述

那么对于这种问题如何解决呢?如何通过编译呢?
在派生类中通过“this->”指涉基类模板内的成员的名称或者明白写出基类的资格修饰符

方法一:这里是引用
方法二:
在这里插入图片描述
方法三:
在这里插入图片描述


条款44.将与参数无关的代码抽离templates

总结:

  • 模板生成多个类和函数,所以任何模板代码都不该与某个造成膨胀的模板参数产生相依关系
  • 因非类型模板参数而造成的模板参数往往可以消除,做法是以函数参数或者类成员 变量替换模板参数
  • 因类型参数而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制表述的局限类型共享实现码

条款45.运用成员函数模板接受所有兼容类型

使用具有继承关系的两个类:基类型和派生类型具现化模板,产生的具现体并不具有类似于基类和派生类的继承关系.

泛化的拷贝构造函数:
这里是引用
上述泛化的拷贝构造函数存在着一定的问题,例如T是派生类型,U是基类类型,我们不希望根据基类类型的指针创建派生类类型的指针,我们想要的是根据派生类类型的指针创建基类类型的指针。
于是有如下的改造方式:在这里插入图片描述
只要在copy构造函数中,初始化的参数列表能够初始化成功,就能够达到上述目标,显然基类的指针不能拷贝给派生类的指针


成员函数模板:这里是引用
在这里插入图片描述
说明:成员函数模板并不会改变语言规则,也就是说:创建一个类时会默认包含默认构造函数、copy构造函数、赋值函数、析构函数,并不会由于泛化的拷贝构造函数的存在而影响copy构造函数
在这里插入图片描述

总结:

  • 使用成员函数模板生成可接受所有兼容类型的函数
  • 如果声明成员函数模板用于泛化拷贝构造或者泛化赋值函数,依然需要声明正常的拷贝构造函数和赋值函数。

条款46.需要类型转换时请为模板定义非成员函数

类似于条款24.需要类型转换时,为此采用非成员函数。
总结:
当我们写一个函数模板,而它所提供的与该模板相关的函数支持所有参数的隐式类型转换时,需要将那些函数定义成模板类内部的友元函数。
解释:
如果使用函数模板,会涉及到实参类型的推导过程,实参类型的推导过程不会将通过构造函数的调用实现隐式的类型转化纳入考虑。
为了实现类型的转换,可以将函数定义成友元函数,以至于在类的具现化时就能够确定函数中形参的类型。那么此时原来的函数模板不在是函数模板而是类模板中的成员函数,因为在具现化类的时候成员函数就已经确定了。
这时,在调用该函数的时候,就可以使用隐式转换。
虽然使用了友元函数,但与传统的友元函数的用途毫无关系

  • 为了让类型转换可能发生于所有实参的身上,我们需要非成员函数(条款24)
  • 为了让这个函数自动具现化,需要将他声明在类内部
  • 声明在类内部唯一的办法就是让她成为友元

条款47.请使用traits classes表现类型信息

traits并不是关键字,它是一种技术,这种技术的要求之一是:对内置类型和用户自定义类型表现的一样好。
习惯上,trait总是被实现为structs,但往往被称为traits class
总结:

  • traits classes使得类型相关信息在编译期可用,他们以模板和模板特化实现
  • 整合重载技术后,traits class有可能在编译期对类型执行if…else测试

对于下述函数,需要在编译期确定iter的类型
这里是引用


条款48.认识template元编程

总结:

  • TMP(Template metaprogramming)模板元编程可将工作由运行期移往编译期,因而可以实现早期错误检测和更高的执行效率
  • TMP可用来生成基于政策选择组合的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值