Effective C++读书笔记(15)(二)

2014-11-24 12:20:05 · 作者: · 浏览: 2
将影响C++挑选适当函数:

std::swap(obj1, obj2); // the wrong way to callswap

这将强制编译器只考虑std中的swap(包括任何模板特化),因此排除了定义在别处的更为适用的T专用版本被调用的可能性。

总结:

首先,如果swap的缺省实现为你的类或类模板提供了可接受的性能,你不需要做任何事。任何试图交换类型的对象的操作都会得到缺省版本的支持,而且能工作得很好。

第二,如果swap缺省实现效率不足(这几乎总是意味着你的类或模板使用了某种pimpl手法),就按照以下步骤来做:

1. 提供一个public的swap成员函数,能高效地交换你的类型的两个对象值,这个函数应该永远不会抛出异常。

2. 在你的类或模板所在的同一个namespace中,提供一个非成员的swap,用它调用你的swap成员函数。

3. 如果你写了一个类(不是类模板),为你的类特化std::swap,并令它调用你的swap 成员函数。

最后,如果你调用swap,确保在你的函数中包含一个using 声明式使std::swap可见,然后在调用swap时不使用任何namespace修饰符。

警告: 绝不要让swap的成员版本抛出异常。这是因为swap非常重要的应用之一是为类(以及类模板)提供强大的异常安全(exception-safety)保证。如果你写了一个swap的自定义版本,那么,典型情况下你提供一个更有效率的交换值的方法,也保证这个方法不会抛出异常。这两种swap的特型紧密地结合在一起,因为高效的交换几乎总是基于内置类型(如pimpl手法下的指针)的操作,而对内置类型的操作绝不会抛出异常。

· 如果 std::swap 对于你的类型来说是低效的,请提供一个 swap 成员函数,并确保你的 swap 不会抛出异常。

· 如果你www.2cto.com提供一个成员 swap,请同时提供一个调用成员swap的非成员swap。对于类(非模板),还要特化 std::swap。

· 调用swap时,请为std::swap使用一个using声明式,然后在调用 swap时不使用任何namespace修饰符。

· 为用户定义类型全特化 std 模板是好的,但绝不要试图往std中加入任何全新的东西。



摘自 pandawuwyj的专栏