C++实现Golang的defer

在golang中有个关键字defer,作用其实就是C++中的析构作用,作为释放资源,但是为什么还要实现它呢?

主要就是为了“擦屁股”,避免程序员忘记后续操作。

C++类似思想的包括智能指针,自解锁等

先贴代码,再说用法

class Defer final
{
public:
	explicit Defer(std::function<void()> fun) : m_funCall(fun) { }
	~Defer() { m_funCall(); }
private:
	std::function<void()> m_funCall;
};

这是一个最简单的实现,不用解释都清楚

再看一下用法

std::string readFile(std::string filename)
{
	std::ifstream ifile(filename);
	Defer def([&ifile](){ ifile.close(); });
	std::ostringstream buf;

	char ch;
	while (buf&&ifile.get(ch))
		buf.put(ch);
			
	return buf.str();
}

上面是读文件操作,目的是为了避免用户忘记关闭文件,那么我们只要再打开后加入此操作

Defer def([&ifile](){ ifile.close(); });

由于def是个局部变量,故在函数结束释放时会自动执行析构,析构里即是关闭文件操作。

有了这种“擦屁股”的功能,很多地方都可得到避免

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值