您的位置:首页 > Web前端

Effective C++ --7 模板与泛型编程

2014-02-01 21:45 190 查看
上一篇Effective C++ -- 6 继承与面向对象设计

41、了解隐式接口和编译器多态

(1)class和template都支持接口和多态。Class支持显示接口,多态是指virtual引起的运行期多态;而template支持隐式接口和编译器多态。

(2)编译器多态是指以不同的template参数具现化function templates会导致调用不同的函数。隐式接口是指template中执行于类型对象身上的操作来决定的。

(3)显示接口由函数的签名式(函数名、参数类型、返回类型)构成,隐式接口不基于函数签名式,而是由有效表达式组成。

42、了解typename的双重含义

(1)声明template参数时,class和typename可互换。

(2)使用typename关键字标识嵌套从属类型名称。Template内体现的名称如果相依于某个template参数,称之为从属名称,如果从属名称在class内呈嵌套状,称之为嵌套从属名。但是不得在base
class lists(基类列)或者member initialization list(成员初始列表)内以它作为base class修饰符。

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

(1)derived class template
往往拒绝调用base class template的函数,因为base class template有可能被特化,而那个特化版本可能不提供和一般性template相同的接口,因此它往往拒绝在templatized
base class内寻找继承而来的名称。

(2)解决上述问题的方法:可在derived class template内通过“this->”指涉base
class template内的成员名称,或籍由一个明白写出base class
资格修饰符完成(using声明式或用base::明确指出调用函数位于base class中)。

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

(1)template
生成多个class和函数,所以任何template代码都不该与某个构成膨胀的template参数产生相依关系。

(2)因非类型模板参数而造成的代码膨胀,往往可以消除,做法是以函数参数或者class成员变量代替template参数。

(3)因类型而造成的代码膨胀,往往可以降低,做法是让带有完全相同二进制表述的具现类型共享实现码。

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

(1)真实指针支持隐式转换,derived指针可以隐式转换为base指针,但是template不同,以带有base-derived的关系的两个类型分别具化某个template,产出来的两个具现体并不带有此种关系。

(2)使用member function templates(成员函数模板)生成“可接受所有兼容类型”的函数。

(3)如果声明member template用于泛化copy构造或泛化assignment操作,还需要声明正常的copy构造函数和copy
assignment操作符。

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

(1)template实参推导过程中从不将隐式类型转换函数纳入考虑,这样的转换在函数调用过程中确实被使用,但是能够调用一个函数之前,首先必须知道这个函数存在,为了知道它,必须先为相关的function
template推导出参数类型,然后才能将适当的函数具现化出来。然而template实参推导过程中并不考虑采纳“通过构造函数而发生的”隐式类型转换。

(2)当编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,将那些函数定义为“class
template内部的friend函数”。原因:为了让类型转换可能发生于所有实参身上,需要non-member函数;为了令函数被自动具现化,需要将它声明在class内部;在class内部声明non-member函数的唯一方法是令它成为friend。

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

(1)traits classes
使得“类型相关信息”在编译期可用,它们以template和template特化完成。不要将能在编译期进行的留到运行期,选择重载而不是判断语句。

(2)整合重载技术后,traits classes有可能在编译器对类型执行if…else测试。

48、认识template元编程

(1)template metaprogramming(TMP,模板元编程)是编写template-based
C++程序并执行于编译器的过程。47的trait解法就是TMP。

(2)TMP可将工作由运行期移往编译器,因而得以实现早期错误侦测和更高的执行效率。TMP同时使程序有较小的可执行文件、较短的运行期、较少的内存需求。

(3)TMP可被用来生产“基于政策选择组合”的客户制定代码,也可用于避免生成对某些特殊类型并不适合的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: