-
条款41:了解隐式接口和编译器多态
- 请记住:
- classes和Templates都支持隐式接口(interfaces)和多态(polymorphism)
- 对classes而言接口是显式的,以函数签名为中心。多态则是通过virtual函数发生于运行期
- 对templates参数而言,接口是隐式地,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。
- 请记住:
-
条款42:了解typename的双重意义
- 请记住:
- 声明template参数时,前缀关键字class和typename可互换
- 请使用关键字typename标识嵌套从属类型名称;但不得在base class lists(基类列)或member initialization list(成员初值列)内以它作为base class修饰符
- 声明template参数时,无论使用关键字class或typename,意义完全一样。
- template内出现的名称如果相依于某个template参数,称之为从属名称。如果从属名称在class内呈嵌套状,我们称它为嵌套从属名称。
- 任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在紧临它的前一个位置放上关键字typename。“typename必须作为嵌套从属类型名称的前缀词”这一规则的例外是,typename不可以出现在base classes list内的嵌套从属类型名称之前,也不可在member initialization list(成员初值列)中作为base class修饰符
- 请记住:
-
条款43:学习处理模板化基类内的名称
- 请记住:请在derived class template内通过“this->”指涉base class template内的成员名称,或借由一个明白写出的“base class资格修饰符”完成
-
条款44:将与参数无关的代码抽离templates
- 请记住:
- Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系
- 因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或class成员变量替换template参数
- 因类型参数而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述的具现类型共享实现码
- 请记住:
-
条款45:运用成员函数模板接受所有兼容类型
- 请记住:
- 请使用member function template(成员函数模板)生成“可接受所有兼容类型”的函数
- 如果你声明member templates用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assignment操作符
- 请记住:
-
条款46:需要类型转换时请为模板定义非成员函数
- 请记住:当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那么函数定义为“class template内部的friend函数”
-
条款47:请使用traits classes表现类型信息
- 请记住:
- traits classes使得“类型相关信息”在编译器可用。它们以templates和“templates特化”完成实现
- 整合重载技术后,traits classes有可能在编译期对类型执行if...else测试
- 请记住:
-
认识template元编程
- Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译器,因为得以实现早期错误侦测和更高的执行效率。
- TMP可被用来生成“基于政策选择组合”的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码
Effective C++(七)模板和泛型编程
猜你喜欢
转载自blog.csdn.net/u010991048/article/details/38277667
今日推荐
周排行