Effective C++ 学习笔记2 模板与泛型编程

  1. c++ 模板最初的发展动机:让我们得以建立"类型安全"的容器,如vector、list和map;
  2. 泛型编程写出的代码和其所处理的对象类型彼此独立;
  3. 模板元编程,创造出在C++编译器内执行并于编译完成时停止运行的程序;
  4. 类和模板都支持接口和多态;
  5. 对类而言,接口是显式的(有函数签名决定),多态则是通过virtual函数发生于运行期,叫做运行时多态;
  6. 对模板参数而言,接口是隐式的,奠基于有效表达式;多态则是通过template具现化和函数重载解析发生于编译期,叫做编译时多态;
  7. 在template表达式中,class和typename的意义完全相同;

template class Widget;
template class Widget;
8. template内出现的名称如果相依于某个template参数,称之为从属名称;如果从属名称在class内呈嵌套状,我们称它为嵌套从属名称。 9. 任何时候当你想要在template中指涉一个嵌套从属类型名称,就必须在紧邻它的前一个位置放上关键字typename,但typename不可以出现在base classes list内的嵌套从属类型名称之前,也不可在member initialization list中作为base class的修饰符。 10. 可在derived class templates 内通过三种方式来指涉base class templates 内的成员名称: (1) 在base class函数调用动作之前加上"this->" ; (2) using声明式 (见条款33); (3) 明白指出被调用的函数位于base class内。 11. 编写templates时,需要做共性和特性的分析,避免重复,在非模板代码中,重复十分明确,在模板代码中,重复是隐晦的,毕竟只存在一份template源码,所以你必须训练自己感受template被具现化多次时可能发生的重复。 12. templates生成多个classes和多个函数,所以任何templates代码都不该与某个造成膨胀的template参数产生相依关系; 13. 因非类型模板参数而造成的代码膨胀,往往可消除,做法是以函数参数或class成员变量替换template参数; 14. 因类型参数而造成的代码膨胀,往往可降低,做法是让带有相同二进制表述的具现类型共享实现码; 15. 所谓智能指针是“行为像指针”的对象,并提供指针没有的机能; 16. 真实的指针是支持隐式转换:
class Top {…}
class Middle : public Top {…}
class Bottom : public Middle {…}
Top* pt1 = new Middle;
Top* pt2 = new Bottom;
const Top* pct2 = pt1
```

  1. 如果用户想要在自定的智能指针上模拟上述转换就有点麻烦,因为同一个模板的不同具现化之间并不存在什么与生俱来的固有关系。
  2. 通过构造模板来实现智能指针的类中接受所有的兼容类型,这样的模板是所谓的member function templates, 简称为成员函数模板,其作用是为class生成函数;
template  
class SmartPtr {
public:
    template
    SmartPtr (const SmartPtr& other); //泛化拷贝构造函数
}
  1. 如果你声明member templates 用于“泛化copy构造” 或 “泛化assignment操作”, 你还是需要声明生成的copy构造函数和copy assignment操作符。

  2. template class 内的friend声明式可以指涉某个特定函数,这样他就不依赖实参推倒,因为实参推倒只施行于function templates身上。

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

  4. STL迭代器分类:
    (1)Input迭代器只能向前移动, 一次一步, 客户只可读取(不能涂写)它们所指的东西;
    (2)Output迭代器只能向前移动,一次一步,客户可涂写它们所指的东西,而且只能涂写一次;
    (3)forward迭代器,这种迭代器可以做前述两种分类所能做的每一件事情,而且可以读写其所指物一次以上;
    (4)Bidirectional迭代器除了可以向前移动,还可以向后移动;
    (5)random access 迭代器,可以执行迭代器算术,它可以在常量时间内向前或向后跳跃任意距离

  5. 如何设计并实现一个traits class:
    (1)确认若干你希望将来可取得的类型相关信息
    (2)为该信息选择一个名称
    (3)提供一个template和一组特化版本,内含你希望支持的类型相关信息

  6. 如何使用一个traits class:
    (1)建立一组重载函数或函数模板,彼此间的差异只在各自的traits参数,令每个函数实现码与其接受之traits信息相应和;
    (2)建立一个控制函数或函数模板,它调用上述那些劳工函数并传递traits class所提供的信息。

  7. 模板元编程可将工作由运行期移往编译期,因而得以实现早起错误侦测和更高的执行效率;

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

你可能感兴趣的:(Effective,C++学习笔记)