#include <iostream>
#include <utility>
template<typename Deleter>
class ScopeGuard
{
private:
bool active_;
Deleter deleter_;
public:
ScopeGuard() = delete;
ScopeGuard(ScopeGuard const &) = delete;
ScopeGuard(ScopeGuard &&) = delete;
ScopeGuard & operator =(ScopeGuard const &) = delete;
ScopeGuard & operator =(ScopeGuard &&) = delete;
ScopeGuard(Deleter deleter)
:
active_{true},
deleter_(std::move(deleter))
{}
~ScopeGuard() noexcept
{
if (active_) deleter_();
}
void dismiss()
{
active_ = false;
}
};
template<typename Deleter>
ScopeGuard<Deleter> make_scope_guard(Deleter deleter)
{
return {std::move(deleter)};
}
int main()
{
auto && guard1 = make_scope_guard([] { std::cout << "guard1\n"; });
auto && guard2 = make_scope_guard([] { std::cout << "guard2\n"; });
guard1.dismiss();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlPHR5cGVuYW1lIERlbGV0ZXI+CmNsYXNzIFNjb3BlR3VhcmQKewpwcml2YXRlOgoJYm9vbCBhY3RpdmVfOwoJRGVsZXRlciBkZWxldGVyXzsKCnB1YmxpYzoKCVNjb3BlR3VhcmQoKSA9IGRlbGV0ZTsKCVNjb3BlR3VhcmQoU2NvcGVHdWFyZCBjb25zdCAmKSA9IGRlbGV0ZTsKCVNjb3BlR3VhcmQoU2NvcGVHdWFyZCAmJikgPSBkZWxldGU7CglTY29wZUd1YXJkICYgb3BlcmF0b3IgPShTY29wZUd1YXJkIGNvbnN0ICYpID0gZGVsZXRlOwoJU2NvcGVHdWFyZCAmIG9wZXJhdG9yID0oU2NvcGVHdWFyZCAmJikgPSBkZWxldGU7CgoJU2NvcGVHdWFyZChEZWxldGVyIGRlbGV0ZXIpCgk6CgkJYWN0aXZlX3t0cnVlfSwKCQlkZWxldGVyXyhzdGQ6Om1vdmUoZGVsZXRlcikpCgl7fQoKCX5TY29wZUd1YXJkKCkgbm9leGNlcHQKCXsKCQlpZiAoYWN0aXZlXykgZGVsZXRlcl8oKTsKCX0KCgl2b2lkIGRpc21pc3MoKQoJewoJCWFjdGl2ZV8gPSBmYWxzZTsKCX0KfTsKCnRlbXBsYXRlPHR5cGVuYW1lIERlbGV0ZXI+ClNjb3BlR3VhcmQ8RGVsZXRlcj4gbWFrZV9zY29wZV9ndWFyZChEZWxldGVyIGRlbGV0ZXIpCnsKCXJldHVybiB7c3RkOjptb3ZlKGRlbGV0ZXIpfTsKfQoKaW50IG1haW4oKQp7CglhdXRvICYmIGd1YXJkMSA9IG1ha2Vfc2NvcGVfZ3VhcmQoW10geyBzdGQ6OmNvdXQgPDwgImd1YXJkMVxuIjsgfSk7CglhdXRvICYmIGd1YXJkMiA9IG1ha2Vfc2NvcGVfZ3VhcmQoW10geyBzdGQ6OmNvdXQgPDwgImd1YXJkMlxuIjsgfSk7CgoJZ3VhcmQxLmRpc21pc3MoKTsKfQ==