2010-04-07 7 views
6

¿Es posible en C++ determinar el número de variables/campos en la clase genérica? por ejemploMeta-programación de plantilla C++, ¿número de variables miembro?

// suppose I need metaclass number_members determines number of members 

struct example { int i, j; }; 
assert(number_members<example>::value==2); 

Miré a través de MPL, pero no pudo encontrar la aplicación.

gracias.

+0

¿Por qué quieres saber cuántas sin saber cuáles son? – Potatoswatter

+0

Sé cómo trabajar con tipos, no estoy familiarizado con otros aspectos y características de la metaprogramación de plantillas, como esta – Anycorn

Respuesta

7

No. C++ no proporciona una introspección general en las estructuras.

Puede probar con C ++0x std::tuple, que tiene algunas de las funciones de un POD general struct. O bien, intente ejecutar el suyo desde la biblioteca Boost MPL. Eso sería un poco avanzado si recién está comenzando con C++.

+1

También vea Boost.Fusion mientras lo hace. Es una buena manera de mezclar plantillas y código de tiempo de ejecución. Personalmente uso 'boost :: fusion :: map' como un esqueleto para' struct'/'class' cuando necesitaba simili-reflection. –

1

No. Desafortunadamente, C++ no tiene ese tipo de introspección integrada. Sin embargo, con algunos preprocesamientos adicionales como Qt 's Meta Object Compiler (moc), puede lograr algo similar ... la clase QMetaObject proporciona un propertyCount(); sin embargo, su clase necesitaría heredar de QObject, usar la macro Q_OBJECT y registrar las propiedades para que todo eso funcione ... así que, en resumen, no es automático.

1

No puede hacer eso directamente. La pregunta obvia, entonces, es qué estás tratando de lograr; es probable que puedas hacer lo que necesites, pero la forma de hacerlo puede ser bastante diferente.

+1

en realidad, no estoy tratando de hacer nada específico. Solo pensé en cómo podría hacerlo y al darme cuenta de que no sé cómo, decidí hacer una pregunta. solo tratando de aprender aspectos adicionales. – Anycorn

Cuestiones relacionadas