1、内容引出
swap()属于STL的一部分(算法),而后成为异常安全性编程的脊柱,以及用来处理自我赋值的可能性的一个常见的机制。它是如此的有用,适当的实现就显得十分重要。然而在它的实现的复杂度也比较高。这个条款就在讲swap()函数的实现问题。
2、 widget 和widgetImpl 都是class时,如何写出高效的swap()
STL 缺省情况下,由STL提供的swap算法完成,如下:
namespace std {
template<typename T>
void swap(T&a, T&b) {
T temp(a);
a = b;
b = temp;
}
}
只要类型T支持copying函数(copy构造、copy赋值符号函数),就可以调用STL的缺省的swap。
然而,标准库版本的swap却存在一个问题,它的实现进行了3次复制,对于某些实现来说,它导致的效率太低了。这些情况主要是指“以指针指向一个对象,内含真正数据”那种类型。这种设计的常见表现形式是所谓的"pimpl"手法。以这种手法实现widget 代码如下:
class WidgetImpl {
private:
int i;
};
class Widgt {
Widgt(const Widgt&rhs);
Widgt&operator = (const Widgt&rhs) {
*imp = *rhs.imp;
}
private:
WidgetImpl* imp;
};
在这种情况下,实际上我们只交换两个指针的指向便可,没有必要交换所指物。但是怎么才能告诉标准库的swap呢?
答案:在std空间内全特化一个swap函数,然后在widget类内写一个成员函数swap,调用该全特化的swap函数。具体代码如下:
class WidgetImpl {