Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- 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>());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement