1. #pragma once
    2. #include <functional>
    3. namespace util {
    4. class Defer final {
    5. public:
    6. Defer() {}
    7. template <typename F, typename... Args>
    8. #if __cplusplus >= 201703L
    9. [[nodiscard("WARNING: Discard me will trigger destructor ASAP!!!")]]
    10. #endif
    11. Defer(F&& fn, Args&&... args)
    12. : f_(std::bind(std::forward<F>(fn), std::forward<Args>(args)...)) {
    13. }
    14. ~Defer() {
    15. if (f_) {
    16. f_();
    17. }
    18. }
    19. private:
    20. std::function<void()> f_;
    21. };
    22. } // namespace util