#include template class ValueGetter { public: explicit ValueGetter(const T& value) : m_value{value} { } const T& get() const { return m_value; } private: const T& m_value; }; template class ValueSetter { public: explicit ValueSetter(T& value) : m_value{value} { } void set(T value) { m_value = value; } private: T& m_value; }; template static std::unique_ptr> MakeGetter(const T& value) { return std::make_unique>(value); } template static std::unique_ptr> MakeSetter(T& value) { return std::make_unique>(value); } class BooleanFlipper { public: explicit BooleanFlipper(bool& val) : m_getter{MakeGetter(val)}, m_setter{MakeSetter(val)} { } bool flip() { if (m_getter->get()) { m_setter->set(false); } else { m_setter->set(true); } return m_getter->get(); } private: std::unique_ptr> m_getter; std::unique_ptr> m_setter; };