博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Effective C++ Item 25 考虑写出一个不抛异常的swap函数
阅读量:6805 次
发布时间:2019-06-26

本文共 1870 字,大约阅读时间需要 6 分钟。

本文为senlie原创,转载请保留此地址:

经验:当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常

演示样例:
stl里的swap算法
namespace std{	template
void swap(T &a, T &b){ T temp(a); a = b; b = temp; }}//“pimpl手法”(pointer to implementation) --> 文件间的编译依存度class WidgetImpl{public: //...private: int a, b, c; std::vector
v; //...}class Widget{public: Widget(const Widget &rhs); Widget &operator=(const Widget &rhs){ //返回的为什么是引用?--> 就应该是引用,參见Item10令operator=返回一个reference to *this。 //这里和Item28不一样,那里说的是不要返回handler指向对象 内部 成分。

//... *pImpl = *(rhs.pImpl); //... } //... private: WidgetImpl *pImpl; }

解析:一旦要转换两个Widget对象值,我们唯一须要做的就是转换其pImpl指针。但缺省的swap算法不知道这一点。它不仅仅复制三个Widgets,还复制三个WidgetImpl对象。
纠正:将std::swap针对Widget特化
通常我们不被同意改变std命名空间的不论什么东西。但能够为标准template制造特化版本号
namespace std{ //这是std::swap针对“T是Widget”的特化版本号。

眼下还不能通过编译 template<> void swap<Widget>(Widget &a, Widget &b){ swap(a.pImpl, b.pImpl); } }

经验:假设你提供一个member swap。也该提供一个non-member swap用来调用前者。对于 classes(而非templates)。也请特化std::swap
演示样例:
namespace WidgetStuff{	class Widget{  //能正常编译,且与STL容器有一致性。

由于全部STL容器也都提供有public swap成员函数和std::swap特化版本号 public: //... void swap(Widget &other){ //调用swap时应针对std::swap使用using声明式。然后调用swap而且不带不论什么“命名空间资格修饰” using std::swap; swap(pImpl, other.pImpl); } //... }; void swap(Widget &a, Widget &b){ //non-member swap 函数。这里并不属于std命名空间 a.swap(b); } } namespace std{ template<> void swap<Widget>(Widget &a, Widget &b){ a.swap(b); } }

经验:为“用户定义类型”进行std templates全特化是好的。但千万不要尝试在std内增加某些对std而言全新的东西
演示样例:
template
class WidgetImpl{ //...}template
class Widget{ //...}namespace std{ //错误,不合法 --> function template仅仅能全特化。不能偏特化 template
void swap
>(Widget
&a, Widget
&b){ a.swap(b); }}namespace std{ template
//std::swap的一个重载版本号,不合法 --> std不同意加入新的的templates void swap(Widget
&a, Widget
&b){ a.swap(b); }}
你可能感兴趣的文章
IIS 7.0 和 IIS 7.5 中的 HTTP 状态代码
查看>>
Dubbo学习总结(1)——Dubbo入门基础与实例讲解
查看>>
rsync搭建及管理
查看>>
STL:std::shared_ptr大致原理.
查看>>
高并发学习笔记(八)
查看>>
第四章 项目管理一般知识
查看>>
Python 调用cobbler API 学习笔记
查看>>
php安装常见错误解决
查看>>
eNsp下载地址(官网)
查看>>
raspberrypi的相关网址
查看>>
DirectX 最终用户运行时 Web 安装程序
查看>>
varnish
查看>>
linux学习-centos7上部署DNS服务
查看>>
在Silverlight中动态绑定页面报表(PageReport)的数据源
查看>>
决心书
查看>>
我的友情链接
查看>>
asci和ascii中文编码问题
查看>>
linux笔记 2-11 系统恢复
查看>>
windows下kafka+ELK的日志系统
查看>>
未来时代
查看>>