37#define DEFER const auto DEFER_CAT_ID(callOnScopeExit, __LINE__) = (Util::tagClassForLambda)->*[&]()
43#define DEFER_CAT_ID(a, b) DEFER_CAT_ID_EXPANDED_HELPER(a, b)
45#define DEFER_CAT_ID_EXPANDED_HELPER(a, b) a##b
49struct TagClassForLambda {
50 constexpr TagClassForLambda() =
default;
62 : lambda(initialLambda)
67 : lambda(other.lambda)
69 other.isOwner =
false;
91template <
class Lambda>
constexpr CallOnScopeExit<Lambda> operator->*(
const TagClassForLambda&, Lambda lambda) {
92 return CallOnScopeExit<Lambda>(lambda);
RAII for implementing DEFER behavior.
CallOnScopeExit(CallOnScopeExit &&other)
Usually optimized away due to RVO.
constexpr CallOnScopeExit(Lambda initialLambda)
Create RAII wrapper around Lambda.
~CallOnScopeExit()
Actual lambda call once CallOnScopeExit goes out of scope.
Helper type to trigger operator ->*.