/*条款25 考虑写出一个不抛异常的swap函数*/
//异常安全性编程的脊柱
#include<iostream>
#include<vector>
using namespace std;
/* 标准库的swap 实现方式
namespace std{//效率低
template<typename T>
void swap(T&a, T&b){
T temp(a);
a = b;
b = temp;
}
}
*/
class WidgetImpl{//针对Widget数据而设计的类 利用其对象指针进行交换
public:
//..
private:
int a, b, c;//内置类型上的操作绝不会抛出异常
vector<double >v;
//...许多数据
};
class Widget{
public:
void swap(Widget &other){
using std::swap;//这里using 声明是必要的
swap(pImpl, other.pImpl);
}
Widget(){}
Widget(const Widget&rhs){}
Widget&operator=(const Widget&rhs){
//...
*pImpl = *(rhs.pImpl);
}
private:
WidgetImpl* pImpl;
};
namespace std{
template<>//代表它是std::swap的一个全特化,相当于<Widget>的一个特化,因为我们不被允许改变std命名空间内的任何东西,但可以为标准template(swap)制造特化版本,又因为pImpl是私有,解决方法可以通过friend,但这里是将Widget声明一个成员函数swap做真正的置换,将std::swap特化,使它调用该成员函数见Widget类
void swap<Widget>(Widget&a, Widget&b){//将std中的swap进行特化
//swap(a.pImpl,b.pImpl) //置换指针就好,但无法通过编译
a.swap(b);//这里调用了成员函数swap
}
}
int main(){
Widget w1, w2;
swap(w1,w2);
system("pause");
return 0;
}
条款25 考虑写出一个不抛异常的swap函数
最新推荐文章于 2023-01-12 13:34:49 发布