20 lines
495 B
C++
20 lines
495 B
C++
#pragma once
|
|
|
|
#include <functional>
|
|
#include <utility>
|
|
|
|
struct Defer_Guard {
|
|
template <typename F>
|
|
Defer_Guard(F && f) : _f(f) {}
|
|
~Defer_Guard() { _f(); }
|
|
std::function<void()> _f;
|
|
};
|
|
struct Defer_Guard_Helper {
|
|
template <typename F>
|
|
Defer_Guard operator+(F&& f) { return Defer_Guard(std::forward<F>(f)); }
|
|
};
|
|
|
|
#define CONCAT_STR_INTERNAL(A, B) A##B
|
|
#define CONCAT_STR(A, B) CONCAT_STR_INTERNAL(A, B)
|
|
|
|
#define defer const auto CONCAT_STR(defer_, __LINE__) = Defer_Guard_Helper{} + [&]
|