模板与泛型编程

模板与泛型编程

41.了解隐式接口和编译期多态

  • classes 和 templates 都支持接口(interfaces)和多态(polymorphism)
  • 对classes而言接口是显式的(explicit),以函数签名为中心.多态则是通过virtual函数发生于运行期.
  • 对template参数而言,接口是隐式的(implict),基于有效表达式.多态则是通过template具现化和函数重载解析(function overloading resolution)发生于编译期.

42. 了解typename 的双重意义

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

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

  • 可在derived class templates 内通过"this->"指涉base class templates内的成员名称,或借由一个明白写出的"base class 资格修饰符"完成.

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

  • Templates生成多个classes和多个函数,所以任何template代码都不该与某个造成膨胀的template参数产生相依关系.
  • 因非类型模板参数(non-type template parameters)而造成的代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数.
  • 因类型参数(type parameters)而造成的代码膨胀,往往可降低,做法是让带有完全相同二进制表述(binary representations) 的具现类型(instantiation types)共享实现码.

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

  • 请使用member function templates(成员函数模板)生成"可接受所有兼容类型"的函数.
  • 如果你声明member templates用于"泛华copy构造"或"泛华assignment操作",你还是需要声明正常的copy构造函数和copy assignment操作符.

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

  • 当我们编写一个class template, 而它所提供之"与此template相关的"函数支持"所有参数之隐式类型转换"时,请将那些函数定义为"class template 内部的friend 函数"

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

  • Traits classes使得"类型相关信息"在编译期可用.它们以templates和"templates 特化"完成实现.
  • 整合重载技术(overloadig)后,traits classes 有可能在编译期对类型执行if ... else 测试.

48.认识template元编程

  • Template metaprogramming(TMP, 模板元编程)可将工作由运行期移往编译期,因而得意实现早起错误侦测和更高的执行效率.
  • TMP可被用来生成"基于政策选择组合"(based on combinations of policy choices)的客户定制代码,也可用来避免生成对某些特殊类型并不适合的代码.
原文地址:https://www.cnblogs.com/o-v-o/p/10162649.html