#pragma once #include template class DeferHolder { public: explicit DeferHolder(Callable&& callable) noexcept: callable_(std::forward(callable)) { } ~DeferHolder() { callable_(); } private: Callable callable_; }; class Defer { public: constexpr Defer() noexcept = default; constexpr ~Defer() noexcept = default; template DeferHolder operator%(Callable&& cb) { return DeferHolder{std::forward(cb)}; } }; #define COMMON_CAT_(x, y) x##y #define COMMON_CAT(x, y) COMMON_CAT_(x, y) #define defer auto COMMON_CAT(_defer_instance_, __LINE__) = Defer{} % [&]()