Получить атрибут по имени - PullRequest
       44

Получить атрибут по имени

6 голосов
/ 27 февраля 2012

У меня есть определение структуры с примерно 25 элементами

struct X { field 1; field 2; .. };    

, и я пытаюсь заполнить его некоторыми значениями карты

Map<String,String> A    

, и это, кажется, очень раздражаетделать это n раз

X->xx = A["aaa"]    

каждый раз, когда я хочу заполнить структуру сообщения.

Можно ли получить доступ к членам по имени, например,

X->get_instance_of("xx").set(A["aaa"]);    

и положить его в цикл?

Ответы [ 5 ]

8 голосов
/ 27 февраля 2012

C ++ не имеет встроенных отражений возможностей более динамических языков, поэтому вы не можете делать то, что хотели бы, используя стандартные возможности языка.

Однако, если все члены одного типа, вы можете сделать это с помощью карты указателей на участников и небольшой подготовки:

 // typedef for the pointer-to-member
 typedef int X::*ptr_attr;

 // Declare the map of pointers to members
 map<string,ptr_attr> mattr;
 // Add pointers to individual members one by one:
 mattr["xx"] = &X::xx;
 mattr["yy"] = &X::yy;

// Now that you have an instance of x...
 X x;
// you can access its members by pointers using the syntax below:
 x.*mattr["xx"] = A["aa"];
2 голосов
/ 27 февраля 2012

Краткий ответ: нет. Это C ++, статически скомпилированный язык, где имена членов структуры конвертируются компилятором в смещения памяти. Он не является динамическим, как PHP или Python, где среда выполнения связана со всеми ссылками на переменные.

1 голос
/ 27 февраля 2012

Это не реально сделать; необходимая информация больше не присутствует во время выполнения. Возможно, вы сможете что-то сделать с map и некоторыми указателями, но, если честно, вам, вероятно, будет лучше просто обернуть это в функцию, которая принимает map и помещает значения в соответствующие поля.

1 голос
/ 27 февраля 2012

Нет. С ++ не имеет отражения. Ява, хотя. Неудивительно, что связанные с SOA вещи с большей вероятностью встречаются с такими языками, как Java, чем с такими языками, как C.

0 голосов
/ 27 февраля 2012

Вы можете создать объект-оболочку для вашей структуры с помощью методов доступа set / get, которые позволят вам перебирать строковые значения для заполнения / чтения базовой структуры, которая является статической.

...