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