今天看刘未鹏的一篇介绍现在C++的文章时,学到了一个C++中实现rollback的技巧。
先定义一个rollback管理类:
class ScopeGuard
{
public:
explicit ScopeGuard(std::function<void()> onExitScope)
: onExitScope_(onExitScope), dismissed_(false)
{ }
~ScopeGuard()
{
if(!dismissed_)
{
onExitScope_();
}
}
void Dismiss()
{
dismissed_ = true;
}
private:
std::function<void()> onExitScope_;
bool dismissed_;
private: // noncopyable
ScopeGuard(ScopeGuard const&);
ScopeGuard& operator=(ScopeGuard const&);
};
然后就可以在代码中这么用了:
ScopeGuard onFailureRollback([&] { /* rollback */ }); ... // do something that could fail onFailureRollback.Dismiss();传进去的lambda函数就是操作失败需要rollback的代码。定义的ScopeGuard会在结束它的生命期的时候析构,如果在do something的时候发生异常,会跳转到异常处理部分,从而导致了ScopeGuard的析构,这时候因为dismiss为false,所以会调用rollback,反正没有异常则Dismiss方法会设置为true,于是析构的时候不会执行rollback。