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可被用来生产“基于政策选择组合”的客户制定代码,也可用于避免生成对某些特殊类型并不适合的代码。
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可被用来生产“基于政策选择组合”的客户制定代码,也可用于避免生成对某些特殊类型并不适合的代码。
相关文章推荐
- effective c++ -- 模板与泛型编程
- <<Effective C++>>读书笔记7: 模板与泛型编程
- Effective C++第七章-模板和泛型编程之编译期多态(运行期多态)和隐式接口(显式接口)
- Effective C++第七章-模板和泛型编程之模板中实现继承
- Effective C++第七章-模板和泛型编程之需要类型转换时请为模板定义非成员函数
- Effective C++第七章-模板和泛型编程之traits和TMP(模板元编程)
- Effective Modern C++翻译(2)-条款1:明白模板类型推导
- 如何写出高效C++(模板与泛型编程)
- 读书笔记_Effective_C++_条款四十五:运用成员函数模板接受所有兼容类型
- c++基础——模板和泛型编程
- C++ 之 模板与泛型编程(二、模板实例化)
- C++ 之 模板与泛型编程
- C++之模板与泛型编程(一)——函数模板
- [C++]模板与泛型编程
- c++ _ 模板与泛型编程
- 《Effective Modern C++》读书笔记(1) -- 模板类型推导(template type deduction)
- C++ primer第二次阅读学习笔记(第16章:模板与泛型编程) .
- C++之模板与泛型编程(下):类模板
- 【C++】泛型编程与模板
- Effective C++笔记(10)—模板与泛型编程(二)