(原创)用c++11实现简洁的ScopeGuard
ScopeGuard的作用是确保资源面对异常时总能被成功释放,就算没有正常返回。惯用法让我们在构造函数里获取资源,当因为异常或者正常作用域结束,那么在析构函数里释放资源。总是能释放资源。如果没有异常抛出则正常结束,只是有异常发生或者没有正常退出时释放资源。关于ScopeGaurd的概念想多了解一点的童鞋点这里和这里。c#中的ScopeGuard比较简单,通过using初始化或者通过finally就可以做到,c++中需要自己去实现。
c++中设计ScopeGuard的关键技术:通过局部变量析构函数来管理资源,根据是否是正常退出来确定是否需要清理资源。用c++11做很简单。
template <typename F>
class ScopeGuard
{
public:
explicit ScopeGuard( F && f) : m_func(std::move(f)), m_dismiss(false){}
explicit ScopeGuard(const F& f) : m_func(f), m_dismiss(false){} ~ScopeGuard()
{
if (!m_dismiss)
m_func();
} ScopeGuard(ScopeGuard && rhs) : m_func(std::move(rhs.m_func)), m_dismiss(rhs.m_dismiss){rhs.Dismiss();} void Dismiss()
{
m_dismiss = true;
} private:
F m_func;
bool m_dismiss; ScopeGuard();
ScopeGuard(const ScopeGuard&);
ScopeGuard& operator=(const ScopeGuard&);
//template<class... Args>
//auto Run(Args&&... args)->typename std::result_of<F(Args...)>::type
//{
//  return m_func(std::forward<Args>(args)...);
//}
};
template <typename F>
ScopeGuard<typename std::decay<F>::type> MakeGuard(F && f)
{
	  return ScopeGuard<typename std::decay<F>::type>(std::forward<F>(f));
}
测试代码:
void TestScopeGuard()
{
std::function < void()> f = [] { cout << "cleanup from unnormal exit" << endl; };
//正常退出
{
auto gd = MakeGuard(f);
//...
gd.Dismiss();
} //异常退出
{
auto gd = MakeGuard(f);
//...
throw ;
} //非正常退出
{
auto gd = MakeGuard(f);
return;
//...
}
}
通过测试程序可以知道,当程序没有发生异常正常退出时,需要调用一下Dismiss函数,以解除ScopeGuard,当程序异常退出时,会进入异常处理函数去释放相应资源,实现ScopeGuard的目的。
c++11 boost技术交流群:296561497,欢迎大家来交流技术。
(原创)用c++11实现简洁的ScopeGuard的更多相关文章
- (原创)C++11改进我们的程序之简化我们的程序(八)
		本次要讲的是如何通过泛型函数来简化我们的程序. 泛型函数除了之前介绍的一些优点外还有两个重要的优点 1.消除重复逻辑,提高程序的内聚性和健壮性 泛型函数在某种程度上用来弥补泛型类型的不足.通过泛型类型 ... 
- (原创)C++11改进我们的程序之简化我们的程序(七)
		这次要讲的内容是:c++11中的tuple(元组).tuple看似简单,其实它是简约而不简单,可以说它是c++11中一个既简单又复杂的东东,关于它简单的一面是它很容易使用,复杂的一面是它内部隐藏了太多 ... 
- (原创)C++11改进我们的程序之简化我们的程序(六)
		这次要讲的内容是:c++11中的lamda表达式. lamda表达式是我最喜欢的一个c++11特性之一,在我的代码中随处可见它的身影,其实在c#3.5中就引入了lamda,java中至今还没引入,要等 ... 
- (原创)C++11改进我们的程序之简化我们的程序(四)
		这次要讲的是:c++11统一初始化.统一begin()/end()和for-loop循环如何简化我们的程序 初始化列表 c++11之前有各种各样的初始化语法,有时候初始化的时候还挺麻烦,比较典型的如v ... 
- (原创)C++11改进我们的程序之简化我们的程序(二)
		这次要讲的是:C++11如何通过组合函数来简化我们的程序.关于组合函数,大家可能对这个概念有点陌生.组合函数是将N个一元函数组成一种更复杂的函数,每个函数的返回值作为参数传给下一个函数,直到传到最后一 ... 
- (原创)C++11改进我们的程序之简化我们的程序(一)
		C++11在很多方面可以简化我们的程序开发,我会在“简化我们的程序”这一系列的博文中一一讲到,敬请关注.这次要讲的是:C++11如何通过获取函数模板的返回值类型来简化我们的程序.在谈到简化之前,我们先 ... 
- (原创)c++11改进我们的模式之改进单例模式
		我会写关于c++11的一个系列的文章,会讲到如何使用c++11改进我们的程序,本次讲如何改进我们的模式,会讲到如何改进单例模式.观察者模式.访问者模式.工厂模式.命令模式等模式.通过c++11的改进, ... 
- 【原创】C++11:左值和右值(深度分析)
		——原创,引用请附带博客地址 2019-12-06 23:42:18 这篇文章分析的还是不行,先暂时放在这以后再更新. 本篇比较长,需要耐心阅读 以一个实际问题开始分析 class Sub{} Sub ... 
- 原创:goldengate从11.2升级到12.1.2
		goldengate从11.2升级到12.1.2 1.停止抽取进程 GGSCI (001.oracle.drs.dc.com) 286> stop EXTSJ01 2. 停止投递和复制进程 等待 ... 
随机推荐
- java开发微信模板消息推送
			发布时间:2018-12-12 技术:springboot+maven 概述 该demo主要涉及微信模板消息推送功能, 详细 代码下载:http://www.demodashi.com/dem ... 
- HttpServer发送数据到kafka
			文件夹 1.需求 2.框架结构图和步鄹图 3.代码结构 4.代码展现 ------------------------ 1.需求 1.1.解析路径,将路径的最后一个字符串作为Appkey: 1.2.数 ... 
- <转>lua解释执行脚本流程
			本文转自:http://www.cnblogs.com/zxh1210603696/p/4458473.html #include "lua.hpp" #include <i ... 
- linux shell 脚本攻略学习9--rename命令详解
			rename命令详解: 对文件重命名是常用的操作之一,一般对单个文件的重命名用mv命令,如: amosli@amosli-pc:~/learn/example$ ls abc.txt amosli@a ... 
- iOS开发调试Reveal使用
			推荐通过Xcode中加断点的方式集成Reveal(小缺陷,当你禁用断点时或者不用Xcode而用Appcode开发时,这个方式是不管用). 打开您的iOS工程,选择 View → Navigators ... 
- cmd.exe_参数_启动参数 cmd加启动运行参数 命令
			cmd.exe_参数_启动参数 /k指定运行后面的String命令,多个命令用&或&&连接,这样||不行&&&都能行,示例: cmd /k cd D:\ ... 
- HDU  4607  Park Visit (树的最长链)
			Park Visit Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ... 
- controller.tabBarItem.title = @"11111"不显示
			场景: 在xcode8.3下 今天在弄工程的时候,发现把之前工程中的tabbar控制器拿过来后,在控制器里面用 controller.tabBarItem.title = @"11111& ... 
- CentOS7下解决ifconfig command not found
			原文地址:https://blog.csdn.net/ryu2003/article/details/78492127 注:本办法仅限于可联网的机器,即在安装时设置了IP地址和DNS可正常上网. 解决 ... 
- ftk学习记(滑动条篇)
			[声明:版权全部,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 前一篇说到了combox.就先看一下效果吧. 说完了combox,就谈谈今天的滑动条.滑动条,当然 ... 
