Effective C++(七)模板和泛型编程

  1. 条款41:了解隐式接口和编译器多态

    • 请记住:
      • classes和Templates都支持隐式接口(interfaces)和多态(polymorphism)
      • 对classes而言接口是显式的,以函数签名为中心。多态则是通过virtual函数发生于运行期
      • 对templates参数而言,接口是隐式地,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译期。
  2. 条款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修饰符
  3. 条款43:学习处理模板化基类内的名称

    • 请记住:请在derived class template内通过“this->”指涉base class template内的成员名称,或借由一个明白写出的“base class资格修饰符”完成
  4. 条款44:将与参数无关的代码抽离templates

    • 请记住:
      • Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系
      • 因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或class成员变量替换template参数
      • 因类型参数而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述的具现类型共享实现码
  5. 条款45:运用成员函数模板接受所有兼容类型

    • 请记住:
      • 请使用member function template(成员函数模板)生成“可接受所有兼容类型”的函数
      • 如果你声明member templates用于“泛化copy构造”或“泛化assignment操作”,你还是需要声明正常的copy构造函数和copy assignment操作符
  6. 条款46:需要类型转换时请为模板定义非成员函数

    • 请记住:当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那么函数定义为“class template内部的friend函数”
  7. 条款47:请使用traits classes表现类型信息

    • 请记住:
      • traits classes使得“类型相关信息”在编译器可用。它们以templates和“templates特化”完成实现
      • 整合重载技术后,traits classes有可能在编译期对类型执行if...else测试
  8. 认识template元编程

    • Template metaprogramming(TMP,模板元编程)可将工作由运行期移往编译器,因为得以实现早期错误侦测和更高的执行效率。
    • TMP可被用来生成“基于政策选择组合”的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码

猜你喜欢

转载自blog.csdn.net/u010991048/article/details/38277667
今日推荐