现在的位置: 首页 > 综合 > 正文

Effective C++之模板和泛型编程

2013年11月12日 ⁄ 综合 ⁄ 共 1149字 ⁄ 字号 评论关闭

7 模板和泛型编程

条款41:了解隐式接口和编译器多态。

面向对象编程世界总是以显示接口和运行期多态解决问题。Template及泛型编程的世界

与面向对象有根本上的不同。在此世界中显示接口和运行期多态任然存在,但重要性降

低。反倒是隐式接口和编译器多态移到前头了。

请记住:

classes和templates都支持接口和多态。

对classes而言接口是显示的,以函数签名为中心。多态则是通过virtual函数发生于运

行期。

对template参数而言,接口是隐式的,奠基于有效表达式。多态则是通过template具现化和函数重载解析发生于编译器。

条款42:了解typename的双重意义。

请记住:

声明template参数时,前缀关键字class和typename可互换。

请使用关键字typename标识嵌套从属类型名称:但不得在base classlists(基类列)过成员初值列内以它作为base class修饰符。

条款43:学习处理模板化基类内的名称。

问题在于,当编译器遭遇classtemplate LoggingMsgSender定义式时,并不知道它进程什么样的class。有三个办法:

第一是在base class函数调用动作之前加上this->:

第二是使用using声明式。

第三个做法是,明白指出被调用的函数位于baseclass内。

条款44:将于参数无关的代码抽离templates。

请记住:

条款45:运用成员函数模板接受所有兼容类型。

真实指针做得很好的一件事是,支持隐式转换。

如果用户在自定的智能指针中模拟上述转换。

但是,同一个template的不同具现体之间并不存在什么与生俱来的固有关系,这里的B,D两类型具现化的template不带有base-derived关系。

我们可以为它写一个构造模板,这样的模板是所谓成员模板,其作用是为class生成函数:

请记住:

请使用成员函数模板生成“可接受所有兼容类型”的函数。

如果你声明成员模板用于泛化copy构造或泛化赋值操作,你还是需要声明正常的copy构造函数和copy 赋值操作符。

条款46:需要类型转换时请为模板定义非成员函数。

现在对operatot*的混合式调用可以通过编译了,因为当对象oneHalf被声明为一个Rational<int>,class Ration<int>于是被具现化出来,而作为国产的一部分,friend函数operator*(接受Rational<int>参数)也就被自动声明出来。

请记住:

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

条款47:请使用traits classes变现类型信息。

抱歉!评论已关闭.