#pragma once #include #define CONCAT2(A, B) A##B #define CONCAT(A, B) CONCAT2(A, B) #define scoped_state(prop, value) auto CONCAT(scoped_state_, __LINE__) = ScopedState(prop, value) namespace jvalidate::detail { class ScopedState { private: std::function reset_; public: template ScopedState(T & prop, T value) : reset_([reset = prop, &prop]() { prop = reset; }) { prop = std::move(value); } ~ScopedState() { reset_(); } explicit operator bool() const { return true; } }; }