---- classes 和 templates 都支持接口(interfaces)和多态(polymorphiism)。
---- 对classes 而言接口是显示(explicit),以函数签名为中心。多态则是通过virtual函数发生于运行期。
---- 对template 参数而言,接口是隐式的(implicit),奠基于有效表达式。多态则是通过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 用于 “泛化构造”或“泛化 assignment 操作”,你还是需要声明正常的copy构造函数和copy assignment 操作符
46、需要类型转换时请为模板定义非成员函数---- 当我们编写一个 class template, 而它所提供的“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template”内部的friend函数
47、请使用traits_classes表现类型信息---- Traits classes 使得“类型相关信息”在编译期可用。它们以templates和“templates 特化”完成实现
---- 整合重载技术(overloading)后,traits classes 有可能在编译期对类型执行if...else测试
48、认识 template 元编程---- Template metaprogramming(TMP 模板元编程)可将工作由运行期移到编译期,因而得以实现早期错误侦测和更高的执行效率。
---- TMP 可被用来生成 “基于政策选择组合”的客户定制代码,也可以用来避免生成某些特殊类型并不合适的代码



