Advertisement
Gistrec

Access to private value [reflection]

Jan 11th, 2018
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.27 KB | None | 0 0
  1. /*
  2. struct Cls {
  3.     Cls(char c, double d, int i);
  4. private:
  5.     char c;
  6.     double d;
  7.     int i;
  8. };
  9.  
  10. Как видно, все поля этого класса закрытые, ваша задача реализовать несколько функций, которые дают полный доступ к этим полям (см. шаблон кода), несмотря на то, что они закрытые.
  11. */
  12.  
  13. template<typename Tag, typename Tag::type M>
  14. struct Rob {
  15.     friend typename Tag::type get(Tag) {
  16.         return M;
  17.     }
  18. };
  19.  
  20. template<typename TGT, typename D, typename USERDATA = void> // USERDATA is for distincion members with same type
  21. struct AcessorTag {
  22.     typedef D TGT::*type;
  23.     friend type get(AcessorTag<TGT, D, USERDATA>);
  24. };
  25.  
  26.  
  27.  
  28. #define DECLARE_PRIVATE_ACCESSOR(CLASSNAME, FIELDTYPE, FIELDNAME) template struct Rob<AcessorTag<CLASSNAME, FIELDTYPE>, &CLASSNAME::FIELDNAME>;
  29. DECLARE_PRIVATE_ACCESSOR(Cls, char, c);
  30. DECLARE_PRIVATE_ACCESSOR(Cls, double, d);
  31. DECLARE_PRIVATE_ACCESSOR(Cls, int, i);
  32.  
  33. char &get_c(Cls &cls) {
  34.     return cls.*get(AcessorTag<Cls, char>());
  35. }
  36.  
  37. double &get_d(Cls &cls) {
  38.     return cls.*get(AcessorTag<Cls, double>());
  39. }
  40.  
  41. int &get_i(Cls &cls) {
  42.     return cls.*get(AcessorTag<Cls, int>());
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement