C ++ рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд
рдкрд╛рдБрдЪ рдорд┐рдирдЯ рдХреА рд╕реЛрдЪ рдореЗрдВ, рдмрд┐рдирд╛ рдкреВрд░реНрд╡рдкреНрд░рдзрд╛рди рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдХреБрдЫ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ ...
рдХреНрдпрд╛ рдпрд╣ "рдХреБрдЫ" рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрд▓рд╕реНрдп рдХреЛ рд╕рдордЭреЗрдВред рдХрдИ рдХрдорд┐рдпрд╛рдВ рд╣реИрдВ, рдирд╛рдо рд╕реЗ рдХреЛрдИ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдмрд┐рдирд╛)
рдЕрдк : рдЧреЗрдЯреНрдЯрд░-рд╕реЗрдЯрд░ - рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛
#include <string> #include <map> #include <iostream> using namespace std; template<class B,class T> class DefineProperty { T value; B *that; typedef void (B::*SetterPtr)(const T&); typedef T (B::*GetterPtr)(const T&) const; void (B::*setter)( const T &val ); T (B::*getter)( const T &val ) const; public: DefineProperty() { setter = NULL; getter = NULL; that = NULL; } DefineProperty(B *self, GetterPtr get, SetterPtr set) { that = self; setter = set; getter = get; } DefineProperty(B *self, SetterPtr set, GetterPtr get) { that = self; setter = set; getter = get; } DefineProperty(B *self, GetterPtr get) { that = self; setter = NULL; getter = get; } DefineProperty(B *self, SetterPtr set) { that = self; setter = set; getter = NULL; } void operator = ( const T &val ) { set( val ); } void set( const T &val ) { value = val; if( setter ) (that->*setter)( val ); } operator T () const { return get(); } T get() const { if( getter ) return (that->*getter)(value); return value; } T field_get() const { return value; } void field_set( const T &val ) { value = val; } }; template<class T,class B> std::ostream& operator<<(std::ostream &out, const DefineProperty<T,B> &val) { out << (val.get()); return out; } class ClassWithProps { public: DefineProperty<ClassWithProps,int> Integer; DefineProperty<ClassWithProps,int> PlainInteger; DefineProperty<ClassWithProps,int> FakedInteger; DefineProperty<ClassWithProps,string> String;