#include<iostream>using namespace std;
/*
1.提供一个public swap成员函数,让它 高效地置换你的 类型 的 两个成员对象 (绝不会抛出异常)
2.在class 或 template 所在 命名空间 内 提供 一个 non-member swap(非成员 函数 的 swap), 并 令它 调用swap 成员函数
3.为正在 编写的 类 class (非 class template),为你的 class 特化std::swap,并 令它 调用swap 成员函数
4.如果你调用swap (例如 :在 dosomething函数 中 调用 swap函数 ),包含一个using 声明式 ,让std::swap在函数内曝光可见
*/
/*
成员版本swap绝不可抛出异常
swap缺省版本 是以 copy构造函数 和  copy assignment操作符 为基础 (一般 两者 都允许 抛出异常)
自定义 swap (1)高效置换对象值 (2)不抛出异常 (1)高效 基于 内置类型的 操作 (例如 pipml 手法的 底层指针) (2)内置类型的 操作 绝不会 抛出异常
*/
namespace WidgetStuff
{template<typename T>class WidgetImp1{};template<typename T>class Widget{public:Widget(){}Widget(const Widget<T>&rhs){}Widget & operator =(const Widget<T> &rhs){*pImp1 = *rhs.pImp1;}void swap(Widget &other){using std::swap;swap(pImp1,other.pImp1);}public:WidgetImp1<T> *pImp1;};/*template <typename T>void swap(Widget<T> &a,Widget<T> &b){a.swap(b);cout<<"WidgetStuff:: void swap(Widget<T> &a,Widget<T> &b)"<<endl;}*/
};
namespace std/*std::模板特化版本*/
{using namespace WidgetStuff;template<>void swap(Widget<int> &a,Widget<int> &b)/*模板的全特化*/{cout<<"std:: void swap(Widget<int> &a,Widget<int> &b)"<<endl;a.swap(b);}
};
template<typename T>
void dosomething(T &obj1,T &obj2)
{using std::swap;/*让std::swap在函数内曝光可见*/swap(obj1,obj2);/*名称查找法则(确保将找到global作用域 或 T所在命名空间内任何T专属的swap*//*如果T是widget 并 位于 命名空间widgetstuff 内 ,编译器会使用“ 实参取决之查找规则” 找出 widgetstuff 内的 swap,如果没有T专属之swap存在,编译器就会使用std内的swap感谢using声明式让std::swap在函数内曝光*/
}int main()
{using namespace WidgetStuff;Widget<int> a;Widget<int> b;swap(a,b);dosomething(a,b);return 0;
}

不抛出异常的swap相关推荐

  1. 为了异常安全(swap,share_ptr)——Effecive C++

    互斥锁: 假设我们要在多线程中实现背景图片的控制: class PrettyMenu{ public:--void changeBackground(std::istream& imgSrc) ...

  2. 《Effective C++》学习笔记(条款25:考虑写出一个不抛异常的swap函数)

    最近开始看<Effective C++>,为了方便以后回顾,特意做了笔记.若本人对书中的知识点理解有误的话,望请指正!!! swap函数是一个非常经典又有用的函数,除了它本身用来交换两个对 ...

  3. effective c++ 学习

    <Effective C++> 目录: 转自:http://blog.csdn.net/KangRoger/article/details/44706403 目录 条款1:视C++为一个语 ...

  4. Effective C++ --4 设计与声明

    上一部分Effective C++ --3 资源管理 18.让接口容易被正确使用,不易被误用 (1)设计接口时要考虑客户可能可能做出的错误输入,如参数的形式等. 19.设计class犹如设计type ...

  5. 万字长文带你一文读完Effective C++

    Effective C++ 视C++为一个语言联邦 STL Template C++ C Object-oriented C++ 一开始C++只是C加上一些面向对象特性,但是随着这个语言的成熟他变得更 ...

  6. Effective 笔记

    1,C++属于一个语言联邦 : C     Object-Oriented C++     Template C++       STL 2,应尽量以const,enum,inline替换#defin ...

  7. C++学习笔记-----operator=函数处理自赋值

    很多时候我们需要对类使用赋值运算符operator=函数来将一个类赋值给令一个类,但是如果类的成员变量中存在指针类型的变量,而且这个指针的内存是从heap内存中申请的时候,在实现赋值运算符函数的时候要 ...

  8. [Effective C++ --029]为“异常安全”而努力是值得的

    假设有个class用来表现夹带背景图案的GUI菜单单,这个class用于多线程环境,所以它有个互斥器(mutex)作为并发控制用: 1 class PrettyMenu{ 2 public: 3 .. ...

  9. C++模板专门化与重载

    最近在复习C++有关知识,又重新看<<Effective C++>>,收获颇丰.原来以前看这边书,好多地方都是浅尝辄止.<<Effective C++>> ...

最新文章

  1. 摄像头YUV图像常见数据格式介绍
  2. 独家 | 使用深度神经网络在Oculus Quest上进行准确的手部追踪
  3. 【Flutter】Flutter 项目中使用 Flutter 插件 ( Flutter 插件管理平台 | 搜索 Flutter 插件 | 安装 Flutter 插件 | 使用 Flutter 插件 )
  4. asp实现注册登录界面_python app (kivy)-与小型数据库连接,实现注册登录操作
  5. C#委托及事件处理机制浅析
  6. 给 ListBox 的 DataTemplate 模板中的 元素设置动画
  7. 使用继承思想,去开发一款组件(element-ui collapse组件为例子)
  8. Epic Games创始人眼中的虚拟现实
  9. 技术总结之SpringIOC
  10. 物流广告收入实现高速增长 国际投行看好京东转型潜力
  11. 写读后感,获赠陈能技老师亲笔签名书《性能测试诊断分析与优化》中奖名单公布啦!...
  12. 三线表(带有行横标目)的绘制方法
  13. C# 反编译修改dll文件
  14. wifi ap6212驱动移植及调试分析技术笔记
  15. Struts2通配符和动态方法调用
  16. AVC、HEVC、VVC帧间预测技术
  17. redis---sds(简单动态字符串)详解
  18. photoshop图片显示为索引,解决办法
  19. ​最适合女生的10个副业(上篇),只要你有执行力,实现财富自由很简单!
  20. 三、大数据存储——HBase

热门文章

  1. windows中PLSQL/Developer、Oracle InstantClient的安装与配置
  2. 用JS中的cookie实现商品的浏览记录
  3. Ubuntu 16.04 LTS安装Docker并使用加速器
  4. Java从入门到精通07-排序
  5. AngularJS源码解析2:注入器的详解
  6. zabbix 接触这段时间的感悟
  7. *推荐* 杏雨梨云U盘系统2011 全面加速 [2010.12.28]
  8. 红包随机算法微信群红包随机算法
  9. SQL语言之关系运算与多表操作(五)
  10. 支持向量机SVM推导