2010-11-05 11 views
11

Supongamos que tenemos una estructura en C++:C/C++ ¿Es posible obtener una "lista" de miembros de instancia al consultar una clase?

struct foobar 
{ 
     int age; 
     bool hot; 
     String name 
}; 

¿Hay alguna manera, mediante programación, para consultar la estructura de arriba para extraer sus miembros de instancia? Por ejemplo:

String[] members = magicClass.getInstanceMembers(foobar); 

miembros tendría ["age", "hot", "name"] ya que es valores.

¿Posible? La razón por la que pregunto es porque tengo estructuras que cambian con el tiempo (variables añadidas/eliminadas). Quiero ser capaz de crear automáticamente archivos Lua de generación con estos datos guardados.

Gracias

+1

Lo siento por la pedantería, pero tengo que preguntar qué tiene esto que ver con C :-) – Christoffer

Respuesta

11

n, C++ estándar no admite ese tipo de reflexión. Hay algunas formas "extravagantes" de usar macros para crear una plantilla tipo-rasgos-esque que usará SFINAE para determinar estáticamente si una clase en particular tiene o no un miembro de datos determinado o función de miembro, pero nada que realmente enumere cada miembro de un clase.

De hecho, C++ fue diseñado con una cierta filosofía en mente que dificultaría, si no contraproducente, soportar el tipo de reflexión en tiempo de ejecución que vemos en lenguajes de alto nivel como C#/Java. Ver Why does C++ not have reflection? para una discusión a fondo sobre este tema.

+0

Dispara. Otra razón por la que Java es el rey para cosas que no sean OS/bajo nivel –

+8

@Carlo del Mundo: En realidad, la mayoría de las personas lo ve como un plus. Aunque la reflexión es realmente útil para construir herramientas de desarrollo. En el código real no es tan útil y a menudo lleva a mantener el código horrible (por supuesto, siempre hay excepciones). –

+1

@Martin, cierto, pero me gustaría ver un mejor soporte para la reflexión * en tiempo de compilación *, que podría ayudar a mejorar los diseños de la biblioteca de plantillas. A pesar de todo, creo que el mejor caso de uso de la reflexión es para implementar funciones de serialización genéricas. –

1

Si realmente, realmente desea escribir código "C++" con la reflexión se puede ver en lo que ROOT hace con cint y el generador de código makecint. Pero esto probablemente no es lo que realmente quieres hacer ...

Cuestiones relacionadas