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

来源:互联网 发布:南京溧水网络问政 编辑:程序博客网 时间:2024/05/17 01:43

上一篇Effective C++ -- 6 继承与面向对象设计

 

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

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

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

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

42、了解typename的双重含义

 1)声明template参数时,classtypename可互换。

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

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

 1derived 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

 1template生成多个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、需要类型转换时请为模板定义非成员函数

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

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

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

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

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

48、认识template元编程

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

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

 3TMP可被用来生产“基于政策选择组合”的客户制定代码,也可用于避免生成对某些特殊类型并不适合的代码。

0 0
原创粉丝点击