2012-02-27 23 views
6

Estoy buscando una solución más profesional para un problema. estoy trabajando en C++ SOAP2 solution.I tienen una Defintion Strcut de unos 25 elementosC++ Structs: obtener el atributo por nombre

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

y estoy Tring para llenarlo con algo de asignar los valores de

Map<String,String> A  

y parece a ser muy molesto para hacer tal cosa n veces

X->xx = A["aaa"]  

cada vez que quiero llenar mi estructura de los mensajes SOAP.

Pregunta: ¿Es posible llamar a struct element por su nombre? * ejemplo: ser abe para procesar la siguiente manera:

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

y ponerlo en un bucle .. *

Gracias,

+0

¿Son todos miembros del mismo tipo? – dasblinkenlight

+0

lazo a través de qué? La solución sería establecer algunos enlaces, pero es difícil de saber ya que no se ha dado suficiente información. – CashCow

+0

¿La estructura es siempre la misma? Y ... ¿son los campos los mismos? –

Respuesta

1

Nº C++ no tiene reflexión. Java aunque. Como era de esperar, las cosas relacionadas con SOA se encuentran más probablemente con lenguajes como Java que con lenguajes como C.

+1

No estoy seguro de que sea cierto. Las API SOAP en Java generan contenedores de código como un paso de compilación. ¿Por qué no debería existir lo mismo para C++? No hay necesidad de usar el reflejo para eso. –

+0

Seguramente se puede hacer también en C++, con punteros de miembro y sobrecargas de función. – Nawaz

+0

@KonradRudolph El [escritor de middleware de C++] (http://webEbenezer.net) hace eso. –

1

No es posible hacerlo; la información que necesita ya no está presente en el tiempo de ejecución. Es posible que pueda hacer algo con un map y algunos punteros, pero para ser honesto, probablemente sería mejor terminarlo en una función que toma un map y coloca los valores en los campos apropiados.

2

Respuesta corta: no. Esto es C++, un lenguaje compilado estáticamente, donde el compilador convierte los nombres de los miembros de la estructura en desplazamientos de memoria. No es dinámico como PHP o Python, donde el tiempo de ejecución está involucrado con todas las referencias de variables.

8

C++ carece de capacidad de reflexión de los lenguajes más dinámicos, por lo que no puede hacer lo que desea utilizando las capacidades de la caja del idioma.

Sin embargo, si todos los miembros son del mismo tipo, puede hacerlo con un mapa de punteros a miembros y un poco de preparación:

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

Incluso si son tipos diferentes, se puede hacer con la función de sobrecarga. – Nawaz

+0

@Nawaz Claro, pero eso requeriría una solución completamente diferente.Además, es muy probable que esa solución sea más elegante que la que propuse. – dasblinkenlight

+0

Sí. Una de estas soluciones está dada por [@Johannes Schaub] (http://stackoverflow.com/users/34509/johannes-schaub-litb) aquí: http://stackoverflow.com/a/287353/415784 – Nawaz

0

Se puede crear un objet envoltorio para su estructura con juego/Obtenga accesodores que le permitirán iterar sobre los valores de cadena para completar/leer la estructura subyacente que es estática.