class scope_guard {
public:
template<class Callable>
scope_guard(Callable&& undo_func) : f(std::forward<Callable>(undo_func)) { }
~scope_guard() {
if (m_active)
if (f)
f();
}
scope_guard() = delete;
scope_guard(const scope_guard&) = delete;
scope_guard& operator = (const scope_guard&) = delete;
scope_guard(scope_guard&&) = delete;
scope_guard& operator = (scope_guard&&) = delete;
bool m_active = true;
private:
std::function<void()> f;
};