2012-02-27 2 views
6

Я wondring для более профессионального решения проблемы. Я работаю на C++ SOAP2 solution.I имеет Strcut дефиницию около 25 элементовC++ Structs: получить атрибут по имени

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

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

Map<String,String> A  

и появляется быть очень раздражающим делать такую ​​вещь n раз

X->xx = A["aaa"]  

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

Вопрос: Можно ли назвать элемент структуры по имени? * пример: быть Абэ, чтобы обработать так:

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

и поместить его в петлю .. *

Спасибо,

+0

Все ли члены этого пользователя? – dasblinkenlight

+0

петля через что? Решение было бы установить некоторые привязки, но это трудно понять, поскольку вы не дали достаточно информации. – CashCow

+0

Структура всегда одна и та же? И .. являются ли типы полей одинаковыми? –

ответ

1

No. C++ не имеют отражения. Java все же. Неудивительно, что связанный с SOA материал, скорее всего, встречается с языками, такими как Java, чем с такими языками, как C.

+1

Не уверен, что это правда. API-интерфейсы SOAP в Java генерируют обертки кода в качестве этапа компиляции. Почему это не должно существовать для C++? Для этого нет необходимости использовать рефлексию. –

+0

Это, безусловно, может быть сделано и на C++, с указателями элементов и перегрузками функций. – Nawaz

+0

@ KonradRudolph [C++ Middleware Writer] (http://webEbenezer.net) делает это. –

1

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

2

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

8

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

Даже если они разные, это может быть сделано с перегрузкой функции. – Nawaz

+0

@Nawaz Конечно, но это потребует совершенно другого решения.Более того, очень вероятно, что такое решение будет более элегантным, чем тот, который я предложил. – dasblinkenlight

+0

Да. Одно из таких решений дано [@Johannes Schaub] (http://stackoverflow.com/users/34509/johannes-schaub-litb) здесь: http://stackoverflow.com/a/287353/415784 – Nawaz

0

Вы можете создать оболочку Objet для структуры с множеством/get accessors, который позволит вам перебирать строковые значения для заполнения/чтения базовой структуры, которая является статической.

Смежные вопросы