Pregunta

Más madura de proyectos de C++ parecen tener una propia la reflexión y el atributo de sistema, i.e para la definición de atributos que pueden ser accedidos por cadena y son automáticamente serializable.Al menos muchos de los proyectos de C++ he participado en parecía reinventar la rueda.

¿Conoces alguna buenas bibliotecas de código abierto para C++ que apoyen la reflexión y el atributo de contenedores, específicamente:

  • La definición de RTTI y atributos a través de macros
  • El acceso a RTTI y atributos a través de código
  • Automática de la seriación de los atributos
  • Escuchar atributo modificaciones (por ejemplo,OnValueChanged)
¿Fue útil?

Solución

Usted podría tener una de las dos herramientas, a continuación.Yo nunca he usado ninguno de ellos, así que no puedo decirte cómo (im)prácticos que son.

XRTTI:

Xrtti es una herramienta y acompañamiento de la biblioteca de C++ que se extiende el estándar de tiempo de ejecución del sistema de tipos de C++ para proporcionar un conjunto más rico de la información de la reflexión acerca de las clases y los métodos para manipular estas clases y sus miembros.

OpenC++:

OpenC++ es C++ frontend de la biblioteca (lexer+analizador+DOM/MOP) y de la fuente a la fuente de traductor.OpenC++ permite el desarrollo de lenguaje C++ herramientas, extensiones de dominio específico de las optimizaciones del compilador y el tiempo de ejecución de metaobject protocolos.

Otros consejos

Esto es lo que usted consigue cuando el C++ se reúne la Reflexión:

C++ meets Reflection

Elija lo que elija, es probable que tenga horrible macros, difíciles de depurar código o extraños pasos de compilación.He visto un sistema generará automáticamente la seriación código de DevStudio del archivo PDB.

En serio, aunque, para proyectos pequeños, será más fácil la escritura de guardar/cargar funciones (o el uso de streaming de operadores).De hecho, que podría deparar grandes proyectos demasiado - es obvio lo que está ocurriendo y por lo general la necesidad de cambiar el código de todos modos si los cambios en la estructura.

Hay un nuevo proyecto de suministro de reflexión en C++ utilizando un enfoque totalmente diferente: CAMPAMENTO. https://github.com/tegesoft/camp

El CAMPAMENTO no utilizar un precompilador, las clases/propiedades/funciones/...se declaran de forma manual utilizando una sintaxis similar a la de impulso.python o luabind.Por supuesto, la gente puede utilizar un precompilador como gccxml o abiertos de c++ para generar esta declaración, si así lo prefieren.

Se basa en puro C++ y aumentar sólo encabezados, y gracias a la potencia de la plantilla de meta-programación es compatible con cualquier tipo de enlazable de la entidad (la herencia y extraño constructores no son un problema, por ejemplo).

Se distribuye bajo la licencia MIT (previamente LGPL).

Miré a estas cosas por un buen tiempo, pero tienden a ser muy dura.Se puede impedir el uso de la herencia, o tener extraño constructores, etc, etc.Al final terminaron siendo demasiado de una carga en lugar de una conveniencia.

Este enfoque para la exposición de los miembros que ahora uso es muy ligero y te permite explorar una clase para la serialización o ajuste de todos los campos denominados "x" a 0, por ejemplo.También es estáticamente determinado por lo que es muy muy rápido.Ninguna de las capas de la biblioteca de código o el código de generación de preocuparse de jugar con el proceso de compilación.Se generaliza a las jerarquías de tipos anidados.

Establecer su editor con algunas macros para automatizar la escritura de algunas de estas cosas.

struct point
{
     int x;
     int y;

     // add this to your classes
     template <typename Visitor>
     void visit(Visitor v)
     {
         v->visit(x, "x"); 
         v->visit(y, "y");
     }
};


/** Outputs any type to standard output in key=value format */
struct stdout_visitor
{
     template <typename T>
     void visit(const T& rhs)
     {
         rhs.visit(this);
     }

     template <typename Scalar>
     void visit (const Scalar& s, const char* name)
     {
          std::cout << name << " = " << s << " ";
     }
}

Visto esto por un tiempo demasiado.La actual solución más sencilla parece ser BOOST_FUSION_ADAPT_STRUCT.Prácticamente una vez que usted tiene una biblioteca/encabezado usted sólo tiene que añadir su estructura de campos en la BOOST_FUSION_ADAPT_STRUCT() macro, como el último segmento de la muestra el código.Sí que tiene restricciones de muchas otras personas han mencionado.Y no oyentes directamente.

El otro prometedoras soluciones miré en el se

  • CAMPAMENTO y XRTTI/gccxml, sin embargo, ambos parecen ser un obstáculo para llevar a herramientas externas de dependencia en el proyecto.
  • Años atrás solía perl c2ph/pstruct para el volcado de la meta información de la salida de gcc -gstabs, que es menos intrusivo, pero necesita más trabajo a pesar de que funcionó a la perfección para mí.

Con respecto a la boost/__cxa enfoque, una vez que averiguar todos los detalles pequeños, agregar, cambiar las estructuras o campos es fácil de mantener.actualmente utilizamos para construir una costumbre de los tipos de enlace de capa en la parte superior de dbus, para serializar el API y ocultar el transporte/RPC detalles de un objeto gestionado por el servicio de subsistema.

No es una norma de carácter general, pero QT apoya esta a través de un meta compilador, y es GPL.Mi comprensión de hablar a la QT de la gente era que esto no es posible con puro C++, de ahí la necesidad de que el moc.

Esta es una notoria debilidad en el lenguaje C++, en general, porque las cosas que tendría que ser estandarizado para hacer la reflexión de las implementaciones portátil y la pena no son estándar.Convenciones de llamada, objeto de disposiciones, y símbolo de destrozarlo vienen a la mente, pero hay otros también.

La falta de dirección del estándar significa que el compilador de los ejecutores va a hacer algunas cosas de manera diferente, lo que significa que muy pocas personas tienen la motivación para escribir un portátil reflexión de la biblioteca, lo que significa que la gente que necesita de la reflexión re-inventar la rueda, pero sólo lo suficiente para lo que necesitan.Esto sucede ad infinitum, y aquí estamos.

Automática de la introspección/reflexión kit de herramientas.El uso de meta compilador como Qt y la adición de la meta-información directamente en archivos objeto.Intuitiva, fácil de usar.Sin dependencias externas.Incluso permitir que se reflejan automáticamente std::string, y luego usarlo en secuencias de comandos.Por favor visite IDK

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top