Effective C++ Item 25 考虑写出一个不抛异常的swap函数
来源:互联网 发布:遮光布 淘宝 编辑:程序博客网 时间:2024/04/29 20:31
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
经验:当std::swap对你的类型效率不高时,提供一个swap成员函数,并确定这个函数不抛出异常
示例:stl里的swap算法
namespace std{template<typename T>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<double> 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<typename T>class WidgetImpl{//...}template<typename T>class Widget{//...}namespace std{ //错误,不合法 --> function template只能全特化,不能偏特化template<typename T>void swap<Widget<T> >(Widget<T> &a, Widget<T> &b){a.swap(b);}}namespace std{template<typename T> //std::swap的一个重载版本,不合法 --> std不允许添加新的的templatesvoid swap(Widget<T> &a, Widget<T> &b){a.swap(b);}}
0 0
- Effective C++ Item 25 考虑写出一个不抛异常的swap函数
- 《Effective C++》学习笔记条款25 考虑写出一个不抛异常的swap函数
- Effective C++:条款25:考虑写出一个不抛异常的swap函数
- 读书笔记《Effective C++》条款25:考虑写出一个不抛异常的swap函数
- 《Effective C++》条款25:考虑写出一个不抛异常的swap函数
- 《Effective C++》读书笔记之item25:考虑写出一个不抛异常的swap函数
- Effective c++(第三版) 条款25:考虑写出一个不抛出异常的swap函数
- 《Effective C ++ 》资源管理:条款25--考虑写出一个不抛出异常的swap函数
- C++之考虑写出一个不抛出异常的swap函数(25)---《Effective C++》
- Effective C++ 条款25:考虑写出一个不抛异常的swap函数
- <Effective C++>:Item25:考虑写出一个不抛出异常的swap函数
- 25考虑写出一个不抛出异常的swap函数——effective c++学习笔记
- effective c++:写出一个不抛出异常的swap函数
- Item 25:考虑实现一个不抛异常的swap Effective C++笔记
- 《Effect C++》学习------条款25:考虑写出一个不抛出异常的swap函数
- [effectiv c++]条款25:考虑写出一个不抛出异常的swap函数
- effective c++ 考虑写出一个不抛出异常的swap函数
- Effective C++——》条款25:考虑写一个不抛出异常的swap函数
- IPtables中SNAT和MASQUERADE的区别
- JS打开新窗口,指定窗口大小。
- OpenEIM 跟大家一起学习正则表达式常用的元字符
- SAP产品概述(砖头版)
- 关于结构体指针的细节
- Effective C++ Item 25 考虑写出一个不抛异常的swap函数
- 设计模式的实际应用——在C#中解决单客户端窗口数据并发问题
- 设计模式之享元模式
- 威利他们的麻雀
- Linux 查找大于100M的文件
- 如何防弹背心经营
- 日语特殊记号的读法
- hdu 2089 不要62
- Android FrameWork log