#pragma once #include namespace util { namespace detail { template struct FinalAction { FinalAction(F f) : m_finally{std::move(f)} {} ~FinalAction() { if (m_enabled) { m_finally(); } } void disable() { m_enabled = false; }; private: F m_finally; bool m_enabled{true}; }; } // namespace detail template detail::FinalAction finally(F f) { return detail::FinalAction(f); } } // namespace util