条款25:考虑写出一个不抛异常的swap函数

本条款名字虽然在说“不抛异常”,然而内容重点却在正确的设计swap使得更高效、节省资源!

 

首先,swap标准程序库定义:

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

 

然而,这种复制的成本对于某些class没有必要,我们这里来看一下  pimpl手法:

 

我们定义public成员函数和std::swap特化版本(调用前者)实现swap:

 

 

 

上面是关于class的swap函数,下面来看下class templates:

 

不要试图在std里头添加新东西,我们将它们置于另外的命名空间内,何必在global命名空间内塞各式各样的名称呢?:

 

 

 

 

我们可以在class所在命名空间内写一个non-member版本以及一个std::swap特化版本:

 

 

 

用户调用:

 

 

 

 

缺省swap版本效率不足,所以我们应该做哪些事情?

 

 

为什么swap不抛异常?因为指针(基本类型)的操作不会抛出异常。

 

总结:

1. 当std::swap对你的类型效率不高时,提供一个swap成员函数,这个成员函数不抛出异常,只对内置类型进行操作

2. 如果提供一个member swap,也该提供一个non-member swap来调用前者,对于普通类,也请特化std::swap

3. 调用swap时,区分是调用自身命名空间的swap还是std的swap,不能乱加std::符号

4. 为“用户自定义类型”进行std template全特化是好的,但千万不要尝试在std内加入某些对std而言全新的东西。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值