Страницы

Поиск по вопросам

понедельник, 24 февраля 2020 г.

Как обратиться в свойству класса зная название этого свойства?

#cpp


Я могу обратиться так :

current_average_speed_element->in_bytes


Как мне обратиться так:

string myvar = "in_bytes";
//...
current_average_speed_element->myvar;


Весь код целиком:

#include 
#include 
#include 
#include 

using namespace std;


class map_element {
   public:
   map_element()
   : in_bytes(0){
   }
   void set(int val){in_bytes=val;}
   uint64_t in_bytes;
};

int main() 
{
    vector current_element;
    current_element.resize(1);
    current_element[0].set(199999);    


    map_element* current_average_speed_element;
    current_average_speed_element = ¤t_element[0];
    string myvar = "in_bytes";
    //cout << "OUT RESULT: " << current_average_speed_element->{myvar} <


Ответы

Ответ 1



То что вы пытаетесь сделать называется Рефлексией(отражением), но в C++ рефлексия не поддерживается. Есть возможность обращения по указателю на член класса, но не по его имени в строке Пример с указателем #include using namespace std; class A{ public: int member; }; using a_member = int A::*; int main() { a_member m = &A::member; // получаем указатель на член класса //... A* a = new A(); a->member = 42; // обращаемся по указателю cout << (a->*m) << endl; delete a; return 0; } ideone На основе этого можно создать словарь(map) "имя"->"указатель" Минимальная реализация: #include #include #include struct A { int first; int second; }; using member_ptr = int A::*; using member_map = std::unordered_map; static member_map Amap = { {"first", &A::first}, {"second", &A::second} }; int main() { A a; a.*(Amap["first" ]) = 42; a.*(Amap["second"]) = 24; std::cout << a.first << std::endl << a.second << std::endl; return 0; } ideone

Комментариев нет:

Отправить комментарий