/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ #ifndef DEFER #define DEFER #include #include namespace icinga { /** * An action to be executed at end of scope. * * @ingroup base */ class Defer { public: inline Defer(std::function func) : m_Func(std::move(func)) { } Defer(const Defer&) = delete; Defer(Defer&&) = delete; Defer& operator=(const Defer&) = delete; Defer& operator=(Defer&&) = delete; inline ~Defer() { if (m_Func) { try { m_Func(); } catch (...) { // https://stackoverflow.com/questions/130117/throwing-exceptions-out-of-a-destructor } } } inline void Cancel() { m_Func = nullptr; } private: std::function m_Func; }; } #endif /* DEFER */