#ifndef GUI_IGEOMETRYSETTINGS_H #define GUI_IGEOMETRYSETTINGS_H #include namespace GUI { template class IGeometrySettings { public: virtual void saveGeometry(const W* widget) = 0; virtual void restoreGeometry(W* widget) const = 0; }; template class [[nodiscard]] GeometrySaver final { public: GeometrySaver(IGeometrySettings& s, W* w) : m_Settings{s}, m_Widget{w} { m_Settings.restoreGeometry(m_Widget); } GeometrySaver(const GeometrySaver&) = delete; GeometrySaver(GeometrySaver&&) = delete; ~GeometrySaver() { m_Settings.saveGeometry(m_Widget); } GeometrySaver& operator=(const GeometrySaver&) = delete; GeometrySaver& operator=(GeometrySaver&&) = delete; private: IGeometrySettings& m_Settings; W* m_Widget; }; template Derived> GeometrySaver(IGeometrySettings&, Derived*) -> GeometrySaver; } // namespace GUI #endif // GUI_IGEOMETRYSETTINGS_H