2012-02-27 19 views
6

Mi chiedo per una soluzione più professionale per un problema. Sto lavorando su C++ SOAP2 solution.I hanno un defintion Strcut di circa 25 elementiStrutture C++: ottieni attributo per nome

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

e sto Tring di riempirlo con un po 'mappa Valori

Map<String,String> A  

e sembra di essere molto fastidioso per fare cosa simile n volte

X->xx = A["aaa"]  

ogni volta che voglio riempire la mia struttura dei messaggi SOAP.

Domanda: È possibile chiamare struct element per nome? * esempio: essere Abe elaborare simili:

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

e metterlo in un loop .. *

Grazie,

+0

Tutti i membri sono dello stesso tipo? – dasblinkenlight

+0

loop through cosa? La soluzione sarebbe quella di impostare alcuni collegamenti, ma è difficile sapere come non hai dato abbastanza informazioni. – CashCow

+0

La struttura è sempre la stessa? E ... i campi sono uguali? –

risposta

1

No. C++ non ha riflessione. Tuttavia, Java lo fa. Non sorprendentemente, roba relativa a SOA è più probabilmente incontrata con linguaggi come Java che con lingue come C.

+1

Non sono sicuro che sia vero. Le API SOAP in Java generano wrapper di codice come fase di compilazione. Perché non dovrebbe esistere lo stesso per C++? Non è necessario usare la riflessione per questo. –

+0

Si può sicuramente fare anche in C++, con i puntatori membri e gli overload di funzioni. – Nawaz

+0

@KonradRudolph Il [C++ Middleware Writer] (http://webEbenezer.net) lo fa. –

1

Non è davvero possibile farlo; le informazioni necessarie non sono più presenti in fase di runtime. Potresti essere in grado di fare qualcosa con un map e alcuni puntatori, ma per essere onesti probabilmente starai meglio avvolgendolo in una funzione che prende uno map e inserisce i valori nei campi appropriati.

2

Risposta breve: no. Questo è C++, un linguaggio compilato staticamente, in cui i nomi dei membri della struttura vengono convertiti dal compilatore in offset di memoria. Non è dinamico come PHP o Python dove il runtime è coinvolto con tutti i riferimenti variabili.

8

C++ non supporta la funzione di integrata con le funzioni di lingue più dinamiche, quindi non è possibile fare ciò che si desidera utilizzando le funzionalità predefinite della lingua.

Tuttavia, se tutti i membri sono dello stesso tipo, si può fare con una mappa dei puntatori ai membri e un po 'di preparazione:

// 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

Anche se si tratta di tipi diversi, può essere eseguito con sovraccarico di funzione. – Nawaz

+0

@Nawaz Certo, ma ciò richiederebbe una soluzione completamente diversa.Inoltre, è molto probabile che tale soluzione sia più elegante di quella che ho proposto. – dasblinkenlight

+0

Sì. Una di queste soluzioni è data da [@Johannes Schaub] (http://stackoverflow.com/users/34509/johannes-schaub-litb) qui: http://stackoverflow.com/a/287353/415784 – Nawaz

0

si potrebbe creare un objet wrapper per la vostra struct con set/ottieni accessors che ti permetteranno di scorrere i valori delle stringhe per riempire/leggere la struttura sottostante che è statica.