C++ Structs: получить атрибут по имени
Я хочу найти более профессиональное решение проблемы. Я работаю над решением C ++ SOAP2. У меня есть определение Strcut из 25 элементов
struct X { field 1; field 2; .. };
и я пытаюсь заполнить его некоторыми значениями карты
Map<String,String> A
и это кажется очень раздражающим, чтобы делать такие вещи n раз
X->xx = A["aaa"]
каждый раз, когда я хочу заполнить мою структуру сообщений SOAP.
Вопрос: можно ли назвать элемент struct по имени?* пример: чтобы быть в состоянии обрабатывать, как это:
X->get_instance_of("xx").set(A["aaa"]);
и поместите его в петлю.. *
Спасибо,
5 ответов
В 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"];
Краткий ответ: нет. Это C++, статически скомпилированный язык, где имена членов структуры конвертируются компилятором в смещения памяти. Он не динамический, как PHP или Python, где среда выполнения связана со всеми ссылками на переменные.
Это действительно невозможно сделать; необходимая информация больше не присутствует во время выполнения. Вы могли бы сделать что-то с map
и некоторые указатели, но, честно говоря, вам, вероятно, было бы лучше просто обернуть его в функцию, которая требует map
и помещает значения в соответствующие поля.
Нет. C++ не имеет отражения. Ява, хотя. Неудивительно, что связанные с SOA вещи, скорее всего, встречаются с такими языками, как Java, чем с такими языками, как C.
Вы можете создать объект-оболочку для вашей структуры с помощью методов доступа set/get, которые позволят вам перебирать строковые значения для заполнения / чтения базовой структуры, которая является статической.