模型与泛型编程
- 条款 41 - 了解隐式接口和编译期多态
- classes 和 templates 都支持 Interfaces 和多态。
- 对 classes 而言接口是显式的,以函数签名为中心,多态则是通过 virtual 函数发生于运行期。
- 对 template 参数而言接口是隐式的,奠基于有效表达式。多态则是通过 template 具现化和函数重载解析发生于编译期。
- 条款 42 - 了解 typename 的双重意义
- 声明 template 参数时,前缀关键字 class 和 typename 可互换
- 请使用关键字 typename 标识嵌套从属类型名称,但不得在基类列和成员初始列以它作为 base class 修饰符。
- 条款 43 - 学习处理模板化基类内的名称
- 可在 derived class templates 通过 this-> 指涉 base class templates 内的成员名称,或借由一个明白写出的 base class 修饰符完成。
- 条款 44 - 将与参数无关的代码抽离 templates
- Templates 生成多个 classes 和多个函数,所以任何 Template 代码都不该与某个造成膨胀的 Template 参数产生相依关系。
- 因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或者 class 成员变量替换 template 参数。
- 因类型参数而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述的具现类型共享实现代码。
- 条款 45 - 运用成员函数模板接受所有兼容类型
- 请使用成员函数模板生成可接受所有兼容类型的函数
- 如果你声明 member templates 用于 “泛化 copy 构造” 或者 “泛化 assignment 操作” ,你还是需要声明正常的的 copy 构造 和 copy assignment 操作。
- 条款 46 - 需要类型转换时请为模板定义非成员函数
- 当我们编写一个 class template , 而它所提供之 “与此 template 相关” 的函数支持 “所有参数之隐式类型转换”时,请将那些函数定义为 “class template 内部的 friend 函数”
- 条款 47 - 请使用 traits classes 表现类型信息
- Traits class 使得类型相关信息在编译期可用,它们使用 template 和 template 特化实现。
- 整合重载技术后,Traits classes 有可能在编译期对类型进行 if...else 测试。
- 条款 48 - 认识 template 元编程
- TMP,模板元编程可将工作由运行期移往编译期,因而得以实现早期错误侦测和更高的执行效率。
- TMP 可被用于生成 “基于政策选择组合” 的客户定制代码,也可用来定制生成对某些特殊类型不合适的代码