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