C ++ рдореЗрдВ рд╕реЗрдЯрд░ рдФрд░ рдЧреЗрдЯреНрдЯрд░ рдХреЗ рд╕рд╛рде рдирд╛рдо рд╕реЗ рд╕реБрд▓рдн рдлрд╝реАрд▓реНрдб рдлрд╝реАрд▓реНрдб

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╕реА ++ рдореЗрдВ рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдкрд╣реБрдВрдЪ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рдзрди рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд╕реА # рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ред рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдПрдХ рд▓реЗрдЦ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣рдмреНрд░рд╛рд╣реНрд░ рдкрд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рджреГрдврд╝рддрд╛ рд╕реЗ рдирд╛рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╛рдо рд╕реЗ рдЦреЗрддреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рдордп рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред

рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рддреЛ рдкрд╣рд▓реЗ рдЙрддреНрддрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ


рдЖрдЗрдП рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдПрдВ рдХрд┐ рдЖрдкрдХреЛ рдЖрдЦрд┐рд░ рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдВрдЯ рдлреАрд▓реНрдб рдЬрд┐рд╕рдХрд╛ рдирд╛рдо "x" рд╣реИред рд╣рдо рдЗрд╕ рд░рд┐рдХреЙрд░реНрдб рд╕реЗ рдХрд╛рдлреА рдЦреБрд╢ рд╣реИрдВ:
field(int,x); 

рдФрд░ рдЖрдЧреЗ рдХреЛрдб рдореЗрдВ рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
 foo.x = 10; int t = foo.x; foo.setField("x", 15); int p = foo.getField("x"); 

рдлрд┐рд░ рднреА рдХрднреА-рдХрднреА рд╣рдо рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рд╕рдВрд╕реНрдерд╛рдкрди рдФрд░ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рднреА рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред
рдФрд░ рдЦреЗрддреЛрдВ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреА рд╣рдореЗрдВ рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ


рд░рди рдЯрд╛рдЗрдо рдореЗрдВ рдЦреЗрддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ? рдХрдо рд╕реЗ рдХрдо рдЙрдирдХреЗ рдирд╛рдо рдФрд░ рдЕрд░реНрдеред рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рдирдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред

рдЯрд╛рдЗрдк

 class Type { public: const std::string name; const size_t size; template <typename T> static Type fromNativeType() { return Type(typeid(T).name(), sizeof(T)); } Type(const char * name, size_t size) : size(size), name(name) { } Type(const Type & another) : size(another.size), name(another.name) { } }; 

рдпрд╣ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд░реНрдЧ рдХреЗ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реЗ рджреВрд░ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдирд╛рдо рдФрд░ рдЖрдХрд╛рд░ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд╢рд╛рдпрдж рдореИрдВ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╡рд░реНрдгрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рд▓рд┐рдЦреВрдВрдЧрд╛ред
рдпрд╣ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рд╕реНрдереИрддрд┐рдХ рд╡рд┐рдзрд┐ рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдЖрдкрдХреЛ рддреНрд░рд┐рдХреЛрдгреАрдп рдХреЛрд╖реНрдардХ рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рддрд░реНрдХреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдХреЗ рдПрдХ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рддрддреНрдХрд╛рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг
 class Bar { public: template <int val> Bar() { int var = val; printf("%d\n", var); } }; 

рдмрд╛рд░ рд╡рд░реНрдЧ рд╕реНрд╡рдпрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЯреЗрдореНрдкрд▓реЗрдЯ рдирд┐рд░реНрдорд╛рддрд╛ рд╣реИред рддреЛ рдЗрд╕ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рддреБрд░рдВрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рднреАрдЦ рдорд╛рдБрдЧрддрд╛ рд╣реИ:
 Bar bar = Bar<10>(); 

рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдорддрд▓рдм рд╣реИ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдирд╛, рди рдХрд┐ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ред
рдХрднреА-рдХрднреА рдЖрдк рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдореИрдВ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗред
рддреЛ рдЯрд╛рдЗрдк рдХрд░реЗрдВ :: fromNativeType <> (), рдПрдХ рдЕрд░реНрде рдореЗрдВ, рдПрдХ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рднреА рд╣реИред

рдЦреЗрдд рдХрд╛ рднрдВрдбрд╛рд░рдг


рдЪреВрдВрдХрд┐ рд╣рдо рд░рди-рдЯрд╛рдЗрдо рд╕реЗ рдЙрдирдХреЗ рдирд╛рдо рд╕реЗ рдЦреЗрддреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рд╕реНрдЯреЛрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдореИрдВрдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛: рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдиреНрдп рд╕рднреА рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗред рдЗрд╕ рд╡рд░реНрдЧ рдореЗрдВ рдлрд╝реАрд▓реНрдб рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
 class Basic { std::vector<FieldDeclaration> fields; public: template <typename FieldType> FieldType getField(const std::string & name, FieldType default) { for(int i = 0; i < fields.size(); ++i) { if (fields[i].name.compare(name)==0) { return static_cast< Field<FieldType>* >(fields[i].pointer)->getValue(); } } return default; } template <typename FieldType> void setField(const std::string & name, FieldType value) { for(int i = 0; i < fields.size(); ++i) { if (fields[i].name.compare(name)==0) { static_cast< Field<FieldType>* >(fields[i].pointer)->setValue(value); } } } }; 

рд╕рдВрднрд╡рддрдГ рдПрд╕рдЯреАрдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ: рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдирдХреНрд╢рд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдПрд╕рдЯреАрдбреА :: рд╡реЗрдХреНрдЯрд░ рдЙрдкрдпреБрдХреНрдд рд╣реИред
FieldDeclaration рдмрд╕ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИред
 struct FieldDeclaration { FieldDeclaration(const std::string & name, const Type & type, void * pointer = NULL) : name(name), type(type), pointer(pointer) { } const std::string name; const Type type; void * pointer; }; 


рдЬрд╛рджреВ рдХрд╛ рдЬрд╛рджреВ


рдмреЗрд╢рдХ, рдпрд╣ рдкреВрд░реА рдкреНрд░рдгрд╛рд▓реА рдкрд╣рд▓реА рдмрд╛рд░ рдирд╣реАрдВ рд▓рд┐рдЦреА рдЧрдИ рдереА, рдФрд░ рдЗрд╕рдХрд╛ рд╕рдмрд╕реЗ рдмреБрдирд┐рдпрд╛рджреА рд╣рд┐рд╕реНрд╕рд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрдИ рдмрд╛рд░ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рддрд░реАрдХреЛрдВ рд╕реЗ рдПрдХ рдореГрдд рдЕрдВрдд рд╣реБрдЖред
рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдХреЗрд╡рд▓ рдХреЛрдб рдЕрдВрд╢реЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдПрдХ рдмрдбрд╝реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рдПрдХ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВред

рдХреБрдЫ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛

 #define __CONCAT__(a,b) a##b #define __STRINGIZE__(name) #name #define __CLASS_NAME__(name) __CONCAT__(__field_class__, name) #define __GETTER_NAME__(fieldname) __CONCAT__(getterof_, fieldname) #define __SETTER_NAME__(fieldname) __CONCAT__(setterof_, fieldname) 


рдЫрджреНрдо рдЦреЛрдЬрд╢рдмреНрдж

рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рд╣рдо рдЗрд╕ рдмрд╛рдд рдкрд░ рд╕рд╣рдордд рд╣реБрдП рдХрд┐ рд╣рдо рдлрд╝реАрд▓реНрдб рд╡рд┐рд╡рд░рдг рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ 2 рддрд░реНрдХ рд╣реИрдВ: рдлрд╝реАрд▓реНрдб рдХрд╛ рдкреНрд░рдХрд╛рд░ рдФрд░ рдирд╛рдоред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд┐рдпрд╛:

 #define smartfield(type,name) \ type __stdcall __GETTER_NAME__(name)(); \ void __stdcall __SETTER_NAME__(name)(type value); \ __FIELD_CLASS_DECLARATION_SMART__(type,name) \ __CLASS_NAME__(name) name; #define field(type, name) \ __FIELD_CLASS_DECLARATION__(type,name) \ __CLASS_NAME__(name) name; 

рд╕реНрдорд╛рд░реНрдЯрдлрд╝реАрд▓реНрдб рдореИрдХреНрд░реЛ рдХреА рдкрд╣рд▓реА рджреЛ рд▓рд╛рдЗрдиреЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдХреЗ рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ рд╕реАрдзреЗ рдЙрд╕ рдХрдХреНрд╖рд╛ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░рддреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдлрд╝реАрд▓реНрдб рд╕реНрдерд┐рдд рд╣реЛрдЧрд╛ред рдлрд┐рд░ рдЖрдкрдХреЛ рдЙрдирдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЙрдиреНрд╣реЗрдВ рдХреНрд░рдорд╢рдГ getter_ <рдлрд╝реАрд▓реНрдб рдирд╛рдо> рдФрд░ рд╕реЗрдЯрд░_ <рдлрд╝реАрд▓реНрдб рдирд╛рдо> рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред
__Stdcall рдХреЙрд▓рд┐рдВрдЧ рдХрдиреНрд╡реЗрдВрд╢рди рд╕рдВрд╢реЛрдзрдХ рдЖрдкрдХреЛ рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдХреНрд▓рд╛рд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ Microsoft __thiscall рдХрдиреНрд╡реЗрдВрд╢рди рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ECX рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ)ред
__FIELD_CLASS_DECLARATION__ рдФрд░ __FIELD_CLASS_DECLARATION_SMART__ рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб ("рдЗрдирд░ рдХрд┐рдЪрди рдХреНрд▓рд╛рд╕реЗрд╕" рд╣рдо рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ) рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред
__CLASS_NAME __ (рдирд╛рдо) рдирд╛рдо; рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ "рдШрд░реЗрд▓реВ рд╡реНрдпрдВрдЬрдиреЛрдВ рдХреА рдХрдХреНрд╖рд╛рдПрдВ" рдХреА рдПрдХ рдкреНрд░рддрд┐ рд╣реИред

рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдб

рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ "рдЖрдВрддрд░рд┐рдХ рд░рд╕реЛрдИ рдХрдХреНрд╖рд╛рдПрдВ" рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп рдлреАрд▓реНрдб рд╡рд░реНрдЧ рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВ
 #define NO_GETTER (TGetter)0 #define NO_SETTER (TSetter)0 template <typename FieldType> class Field { protected: typedef FieldType (*TGetter)(void *); typedef void (*TSetter)(void *, FieldType); TGetter getter; TSetter setter; void * that; public: const std::string name; const Type type; FieldType value; template< typename OwnerType > Field(OwnerType * _this, const char * nm) : name( nm ), type( Type::fromNativeType<FieldType>() ), getter(NO_GETTER), setter(NO_SETTER), that(_this) { _this->fields.push_back(FieldDeclaration(name, type, this)); } template< typename OwnerType > Field(OwnerType * _this, const char * nm, const FieldType & initvalue) : name( nm ), type( Type::fromNativeType<FieldType>() ), value(initvalue), getter(NO_GETTER), setter(NO_SETTER), that(_this) { _this->fields.push_back(FieldDeclaration(name, type, this)); } FieldType getValue() { if (getter) return getter(that); else return value; } void setValue(FieldType val) { if (setter) setter(that,val); else value = val; } Field<FieldType> & operator = (FieldType val) { setValue(val); return *this; } operator FieldType() { return getValue(); } }; 

рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреНрд▓рд╛рд╕ рдлрд╝реАрд▓реНрдб рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдХреЗрдд рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рд╕:

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рдХрд╛рд░ TGetter рдФрд░ TSetter рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдХрд┐ рд╡реЗ рдЬрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рд╡реЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╢реВрдиреНрдп * рд╕реВрдЪрдХ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕реВрдЪрдХ рд╣реИред рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ __stdcall рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдм рдбрд┐рдЬрд╛рдЗрдирд░ред рд╡реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рд╣реИрдВ, рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдХреЛ рдУрдирд░рдЯрд╛рдЗрдк рдорд╛рд▓рд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рдорд╛рдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рд╡рд╣ рд╡рд░реНрдЧ рдЬрд┐рд╕рдореЗрдВ рдлрд╝реАрд▓реНрдб рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдЦреБрдж рдУрдирд░рдЯрд╛рдЗрдк рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд░рддрд╛ рд╣реИред рд╡реИрд╕реЗ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: рдпрджрд┐ рдпрд╣ рдЙрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╕рдВрднрд╡ рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдкрдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рддреЛ рдпрд╣реА рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдпрд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИред рдЬрдм рдЗрд╕реЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдХреЗ рдкрд╛рд╕ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЦреБрдж рдХреЛ OwnerType рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред
рддрд░реНрдХ nm рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддреАрдХрд╛рддреНрдордХ рдирд╛рдо рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рдЙрдЪреНрдЪ рдореИрдХреНрд░реЛ рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдСрдкрд░реЗрдЯрд░ (рдКрдкрд░ __STRINGIZE__ рджреЗрдЦреЗрдВ) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рд╣рдо рд╢реВрдиреНрдп рдорд╛рди рдХреЗ рд╕рд╛рде рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдореМрдЬреВрдж рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рд╡рд╛рд░рд┐рд╕ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рджреВрд╕рд░реЗ рдирд┐рд░реНрдорд╛рддрд╛ рдФрд░ рдкрд╣рд▓реЗ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдлрд╝реАрд▓реНрдб рдорд╛рди рд▓реЗрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдХреНрд╕рд░ рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдмрд╛рдж рдбрд┐рдлреЙрд▓реНрдЯ рдЧреЗрдЯреНрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рд╣реИрдВред рд╡реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдПрдХ рдЧреЗрдЯрдЯрд░ / рд╕реЗрдЯрд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрджрд┐ рд╡реЗ рд╕реЗрдЯ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕ рдХреЗ рд╕реНрдкрд╖реНрдЯ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░реЗрдВред рдЕрдиреНрдпрдерд╛, рд╡реЗ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ / рдПрдХ рдирдпрд╛ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред

рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдСрдкрд░реЗрдЯрд░ рдФрд░ рдХрд╛рд╕реНрдЯ рдСрдкрд░реЗрдЯрд░ рдХреЛ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдлрд╝реАрд▓реНрдб рдорд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЗрдВрдбреЛрд░ рдХрд┐рдЪрди рдХреНрд▓рд╛рд╕реЗрд╕


 #define __FIELD_CLASS_DECLARATION__(type, name) \ class __CLASS_NAME__(name) : public Field<type> \ { \ public: \ __FIELD_CLASS_CONSTRUCTOR_1__(type,name) \ __FIELD_CLASS_CONSTRUCTOR_2__(type,name) \ __CLASS_NAME__(name) & operator = (type val) \ { \ Field<type>::operator=(val); \ return *this; \ } \ }; #define __FIELD_CLASS_DECLARATION_SMART__(type, name) \ class __CLASS_NAME__(name) : public Field<type>\ { \ public: \ __FIELD_CLASS_CONSTRUCTOR_1_SMART__(type,name) \ __FIELD_CLASS_CONSTRUCTOR_2_SMART__(type,name) \ __CLASS_NAME__(name) & operator = (type val) \ { \ Field<type>::operator=(val); \ return *this; \ }\ }; 

рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЛ рд╕реАрдзреЗ рд╕реНрд╡рд╛рдореА рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд╛рдо рдХреЛ рдПрдХрдЬреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, __CLASS_NAME__ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдКрдкрд░ рджреЗрдЦреЗрдВ)ред рд╡реЗ рд╕рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд╛рдирд╛ рдлреАрд▓реНрдб рдХреНрд▓рд╛рд╕ рдХреЗ рд╡рдВрд╢рдЬ рд╣реИрдВред
рдСрдкрд░реЗрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрджрд░реНрдн рдХреЗ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ, рдЗрд╕рд╕реЗ рдЖрдк рдХреИрд╕реНрдХреЗрдбрд┐рдВрдЧ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реЛрдВ рдореЗрдВ рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рд╕рднреА рдЕрдВрддрд░ред

рдЗрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ

 #define __FIELD_CLASS_CONSTRUCTOR_1_SMART__(type,name) \ template< class OwnerType > \ __CLASS_NAME__(name)(OwnerType * _this) \ : Field<type>(_this, __STRINGIZE__(name)) \ { \ auto get_ptr = &OwnerType::__GETTER_NAME__(name); \ auto set_ptr = &OwnerType::__SETTER_NAME__(name); \ this->getter = (TGetter)(void*)*(void**)(&get_ptr); \ this->setter = (TSetter)(void*)*(void**)(&set_ptr); \ } #define __FIELD_CLASS_CONSTRUCTOR_2_SMART__(type,name) \ template< class OwnerType > \ __CLASS_NAME__(name)(OwnerType * _this, type initvalue) \ : Field<type>(_this, __STRINGIZE__(name), initvalue) \ { \ auto get_ptr = &OwnerType::__GETTER_NAME__(name); \ auto set_ptr = &OwnerType::__SETTER_NAME__(name); \ this->getter = (TGetter)(void*)*(void**)(&get_ptr); \ this->setter = (TSetter)(void*)*(void**)(&set_ptr); \ } #define __FIELD_CLASS_CONSTRUCTOR_1__(type,name) \ template< class OwnerType > \ __CLASS_NAME__(name)(OwnerType * _this) \ : Field<type>(_this, __STRINGIZE__(name)) \ { \ } #define __FIELD_CLASS_CONSTRUCTOR_2__(type,name) \ template< class OwnerType > \ __CLASS_NAME__(name)(OwnerType * _this, type initvalue) \ : Field<type>(_this, __STRINGIZE__(name), initvalue) \ { \ } 

рдЖрдВрдХрдбрд╝реЗ 1 рдФрд░ 2 рдХреНрд╖реЗрддреНрд░ рдХреЗ рдореВрд▓реНрдп (2) рдФрд░ рдмрд┐рдирд╛ (1) рдХреЗ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рдУрдВ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рд╣реИрдВред рд╢рдмреНрдж рд╕реНрдорд╛рд░реНрдЯ рдПрдХ рдЧреЗрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рднреА рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рднреА рд╣реИрдВ (рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛ рдХреЛ рд╕рд╣реЗрдЬрд╛ рдФрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП) рдФрд░ рдЙрд╕реА рддрд░рд╣ рд╕реЗ OwnerType рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╕рдВрдмрдВрдзрд┐рдд рдлрд╝реАрд▓реНрдб рдирд┐рд░реНрдорд╛рддрд╛ рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рд╡реИрд▓реНрдпреВ (рдпрджрд┐ рдХреЛрдИ рд╣реЛ), рдлрд╝реАрд▓реНрдб рдирд╛рдо рднреА рдЗрд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЙрдиреНрд╕реНрдЯ рдЪрд╛рд░реНрдЬ [] __STRINGIZE__ рдореИрдХреНрд░реЛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╛рдкреНрдд рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЗрд╕рдХреЗ рдмрд╛рдж, SMART рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдореЗрдВ, рдЧреЗрдЯрд░реНрд╕ рдФрд░ рд╕реЗрдЯрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреЙрдЗрдВрдЯрд░реНрд╕ рд╕реЗрд╡рд┐рдВрдЧ рдФрд░ рд╕реЗрд╡рд┐рдВрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдмрд╣реБрдд рдЕрдЬреАрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╕реА ++ рдХрдбрд╝рд╛рдИ рд╕реЗ рд╕рдВрдХреЗрдд рдХреЗ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐, рд╡рд┐рд░рд╛рд╕рдд рдФрд░ рдЖрднрд╛рд╕реА рддрд░реАрдХреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП, рд╣рдореЗрд╢рд╛ рдПрдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╡реНрдпрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдЧреЗрдЯрдЯрд░ рдФрд░ рд╕реЗрдЯрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рд╢реВрдиреНрдп * рджреНрд╡рд╛рд░рд╛ред
рд╣рдо рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреЛ рд╕реА ++ рд╕рдВрдХрд▓рдХ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред рдореИрдВрдиреЗ рдкреНрд░рдХрд╛рд░ рдСрдЯреЛ рд▓рд┐рдЦрд╛ рдерд╛, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП C ++ 0x рдХрд╛ рдзрдиреНрдпрд╡рд╛рджред
рдЕрдЧрд▓рд╛, рд╣рдореЗрдВ рдЗрди рдЕрд╕реНрдерд╛рдпреА рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрдд рдорд┐рд▓рддреЗ рд╣реИрдВред рдЗрди рдмрд┐рдВрджреБрдУрдВ рдХреЛ рд╢реВрдиреНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред рдлрд┐рд░ рдбреЗрд░реЗрдХреНрд╢рди рдФрд░ рд╢реВрдиреНрдп рд╣реЛ рдЬрд╛рдУ *ред рдЦреИрд░, рдЕрдВрдд рдореЗрдВ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА TGetter рдпрд╛ TSetter рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред

рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢


рдЪреВрдБрдХрд┐ рдлрд╝реАрд▓реНрдб рдХреЛ рд╕рд╛рдорд╛рдиреНрдп рдСрдкрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреЙрдЗрдВрдЯрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рднреА рдлрд╝реАрд▓реНрдб рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЫреЛрдЯреЗ рдореИрдХреНрд░реЛрдЬрд╝ рд▓рд┐рдЦрдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдЖрдкрдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
 #define initfieldval(name, value) name(this, value) #define initfield(name) name(this) 

рдкрд╣рд▓рд╛ рдореВрд▓реНрдп рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИ, рджреВрд╕рд░рд╛ рд╕рд░рд▓ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╣реИред

рд╡рд╣ рд╕рдм рд╣реИ!

рдХреЗ рдЙрдкрдпреЛрдЧ


 #include "basic.h" class Foo : public Basic { public: smartfield(int, i); field(float, f); Foo(); }; Foo::Foo() : initfield(i), initfieldval(f, 3.14) { } int Foo::getterof_i() { printf("Getting field i of class Foo\n"); return i.value; } void Foo::setterof_i(int value) { printf("Setting field i of class Foo\n"); i.value = value; } int main() { Foo foo; int j = foo.i; foo.setField("i", 10); int k = foo.getField("i", -1); float z = foo.f; return 0; } 


рдирд┐рд╖реНрдХрд░реНрд╖


рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХреНрд▓рд╛рд╕ рдлреАрд▓реНрдб рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдРрд╕рд╛ рдЯреВрд▓ рдорд┐рд▓рд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд░рди рдЯрд╛рдЗрдо рд╕реЗ рдирд╛рдо рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдФрд░ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдмрд╕рдиреЗ рдФрд░ рдкрд╛рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рдореИрдВ рдпрд╣ рджрд╛рд╡рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдпрд╣ рдХрд╛рд░реНрдп рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Minuses рдореЗрдВ рд╕реЗ, рдореИрдВ рд╕реНрдерд┐рд░ рдлрд╝реАрд▓реНрдбреНрд╕ (рдЕрднреА рдХреЗ рд▓рд┐рдП) рдмрдирд╛рдиреЗ рдХреА рдЕрд╕рдВрднрд╡рддрд╛ рдкрд░ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рдХреЗ рд╕рд╛рде рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЖрд░рдореНрдн рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢рдмреНрджреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рд╕реНрд░реЛрдд рдХреЛрдб

рдкреБрдирд╢реНрдЪ
рдпрд╣рд╛рдВ рд▓рд┐рдЦреА рдЧрдИ рд╣рд░ рдЪреАрдЬ рд╕реА ++ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрдпрд╛рд░ рд╕реЗ рдмрд╛рд╣рд░ рдкреИрджрд╛ рд╣реБрдИ рдереАред
рдмреЗрд╢рдХ, рдореИрдВ рдХрднреА рднреА рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ рдРрд╕рд╛ рдирд╣реАрдВ рд▓рд┐рдЦрддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЗрд╕реЗ рджреВрд╕рд░реЛрдВ рдХреЛ рдирд╣реАрдВ рд╕реБрдЭрд╛рддрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдХрд╛рдлреА рдореБрд╢реНрдХрд┐рд▓ рд╣реИред

рдкреАрдПрд╕ 2
рдореБрдЭреЗ рдмрд╣реБрдд рдЧреБрд╕реНрд╕рд╛ рд╣реИ рдХрд┐ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рднреА рдЗрд╕реЗ рд░реЛрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдпрджрд┐ рддрд░реНрдХреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЛ рдЕрдзрд┐рднрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рддреЛ рдлрд╝реАрд▓реНрдб рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореИрдХреНрд░реЛрдЬрд╝ рдФрд░ рднреА рд╕реБрдВрджрд░ рджрд┐рдЦреЗрдВрдЧреЗред

Source: https://habr.com/ru/post/In125880/


All Articles