Effective C++ 模板与泛型编程

条款41:了解隐式接口和编译期多态 Understand implicit interfaces and compile-time polymorphism.

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

条款42:了解typename的双重意义 Understand the two meanings of typename.

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

条款43:学习处理模板化基类内的名称 Know how to access names in templatized base classes.

请记住
■ 可在derived class templates内通过 "this->;" 指涉base class templates内的成员名称,或藉由一个明白写出的“base class资格修饰符”完成。

条款44:将与参数无关的代码抽离templates Factor parameter-independent code out of templates.

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

条款45:运用成员函数模板接受所有兼容类型 Use member function templates to accept"all compatible types."

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

条款46:需要类型转换时请为模板定义非成员函数Define non-member functions inside templates when type conversions are desired.

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

条款47:请使用traits classes表现类型信息 Use traitsclasses for information about types.

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

条款48:认识template元编程 Be aware of template metaprogramming.

Template metaprogramming(TMP,模板元编程)是编写template-basedC++程序并执行于编译期的过程。

TMP有两个伟大的效力。
第一,它让某些事情更容易。如果没有它,那些事情将是困难的,甚至不可能的。
第二,由于template metaprograms执行于C++编译期,因此可将工作从运行期转移到编译期。

TMP已被证明是个“图灵完全”(Turing-complete)机器,意思是它的威力大到足以计算任何事物。

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

后续:
实际分析代码主注意相关内容,有些已经见过了,但是这里的总结扩展了相关主题。
名词图灵完全,在理解一下。

摘自《Effective C++:改善程序与设计的55个具体做法:第三版》

你可能感兴趣的:(Effective C++ 模板与泛型编程)