Item25 考虑写出一个不抛出异常的swap函数

swap函数,原本只是STL的一部分,后来成为异常安全性编程的脊柱,以及用来处理自我赋值可能性的一个常见机制。

典型实现:

namespace std {
    template<typename T>
    void swap(T& a, T& b)
    {
        T temp(a);
        a = b;
        b = temp;
    }
};

如指针指向一个对象,内含真正数据,这种设计常见表现形式就是所谓的“pImpl”手法。一旦要置换两个对象值,唯一需要做的就是置换其pImpl指针,但缺省swap算法不知这点。

这里,可以针对对象特化,如:

Class Widget {
public:
    ...
    void swap(Widget& other) 
    {
        using std::swap;
        swap(pImpl, other.pImpl);    //置换的是pImpl指针
    }
};

namespace std {
    template<>                        // std::swap的一个全特化
    void swap<Widget>(Widget& a, Widget& b)
    {
        a.swap(b);
    }
};

写在最后

  • 如果swap的缺省实现对你的class或class template提供可接受的效率,你不需要额外做任何事。任何尝试swap对象都会取得缺省版本
  • 如果swap缺省版本的效率不足:
  1. 提供一个public swap成员函数,让它高效地swap你的类型的两个对象值。(绝不该抛异常)
  2. 在class或template所在的命名空间内提供一个非成员函数swap,并令它调用上述swap成员函数
  3. 如编写一个class(而不是class template),为你的class特化std::swap。并令它调用swap成员函数。
  • 如果你调用swap,请确定包含一个using声明式,以便让std::swap在函数内可见,然后不加任何namespace修饰,直接调用swap。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

子建莫敌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值