/* struct Cls { Cls(char c, double d, int i); private: char c; double d; int i; }; Как видно, все поля этого класса закрытые, ваша задача реализовать несколько функций, которые дают полный доступ к этим полям (см. шаблон кода), несмотря на то, что они закрытые. */ template struct Rob { friend typename Tag::type get(Tag) { return M; } }; template // USERDATA is for distincion members with same type struct AcessorTag { typedef D TGT::*type; friend type get(AcessorTag); }; #define DECLARE_PRIVATE_ACCESSOR(CLASSNAME, FIELDTYPE, FIELDNAME) template struct Rob, &CLASSNAME::FIELDNAME>; DECLARE_PRIVATE_ACCESSOR(Cls, char, c); DECLARE_PRIVATE_ACCESSOR(Cls, double, d); DECLARE_PRIVATE_ACCESSOR(Cls, int, i); char &get_c(Cls &cls) { return cls.*get(AcessorTag()); } double &get_d(Cls &cls) { return cls.*get(AcessorTag()); } int &get_i(Cls &cls) { return cls.*get(AcessorTag()); }