Gistrec icon

Access to private value [reflection]

Gistrec | PRO | 01/11/18 12:13:41 PM UTC | 0 ⭐ | 813 👁️ | Never ⏰ | []
C++ |

1.27 KB

|

None

|

0 👍

/

0 👎

/*
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

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎