2010-11-20 13 views
17

Actualmente voy a escribir un gran proyecto en C++ 11.C++ 11 biblioteca de reflexión

Estoy buscando algo de tiempo buena biblioteca de reflexión C++ 11/C++ y he encontrado varias bibliotecas diferentes, pero la mayoría de ellas simplemente no se actualizan en los últimos años o su funcionalidad es muy limitada.

¿Me podría decir si hay una muy buena biblioteca de C++ 1/C++ para la reflexión? (Quiero tener una reflexión estática y dinámica, conozco toda la información posible sobre métodos, clases, etc., puedo agregar y acceder de forma dinámica a métodos, etc.)

O tal vez C++ 11 ha proporcionado alguna funcionalidad adicional que ayudará para diseñar mejor las bibliotecas de reflexión y ¿debería escribirlo solo? (No he encontrado información sobre él sin embargo.)

+8

Parece que su diseño no coincide con su elección de un idioma. – ybungalobill

+0

Esta es [una pregunta similar] (http://stackoverflow.com/questions/41453/how-can-i-add-reflection-to-a-c-application). También estaba buscando y encontré [CAMP] (https://github.com/tegesoft/camp). Tengo un [fork] (https://github.com/billyquith/camp) yendo que elimina la dependencia de Boost y usa C++ 11 en su lugar. – Nick

+0

No estoy seguro de cuánto ha cambiado esto a lo largo de los años, pero es posible que pueda lograr algunas de las características de la reflexión mediante un diseño cuidadoso. Por ejemplo: el patrón de decorador para agregar/modificar el comportamiento en CT o RT (https://en.wikipedia.org/wiki/Decorator_pattern); SFINAE para detectar una función en CT https://stackoverflow.com/a/29319078/1043529; dep. inversión (https: //en.wikipedia.org/wiki/Dependency_inversion_principle) para buscar métodos específicos (CRTP y static_cast para CT, dynamic_cast para RT) y más. Reflexión completa para tipos verdaderamente arbitrarios? Elige tus batallas, esta es cuesta arriba. –

Respuesta

9

C++ no es realmente el mejor lenguaje para la reflexión. C++ 0x realmente no cambia eso. Puede obtener soporte limitado para la reflexión estática usando rasgos de tipo, e incluso puede usar SFINAE para determinar estáticamente si una clase determinada tiene una función miembro o una variable miembro particular. Pero eso es realmente todo.

reflexión dinámica es muy limitada. Puede obtener el tipo de una clase en tiempo de ejecución utilizando las instalaciones <typeinfo>, pero eso es todo.

Como estática para la reflexión, la capacidad de iterar sobre genéricamente una clase y obtener cada variable miembro/función no es sólo posible sin compromisos serios. Boost.Fusion se las arregla para lograr esto al proporcionar macros que le permiten vincular un objeto a un contenedor tipo tupla. De hecho, la clase std::tuple o boost::tuple proporciona naturalmente una reflexión en tiempo de compilación, en otras palabras, puede iterar estáticamente sobre una tupla y determinar el tipo de cada miembro. Esto le da algo que se aproxima a la reflexión en tiempo de compilación sobre los tipos de agregado arbitrarios. Desafortunadamente, no es tan conveniente como si hubiera soporte nativo de reflexión incorporado para clases arbitrarias.

5

Parece que hay una biblioteca que satisifies sus requerimientos "anchas". Eche un vistazo a Mirror: Boost.Mirror. Tenga en cuenta que oficialmente NO es parte de impulso. También puede echar un vistazo a otras bibliotecas: Reflective Programming.

+0

¡Gracias! Esto es realmente interesante, lo voy a ver más de cerca :) –

+0

+1 se ve muy bien - con algunos pequeños ajustes, parece funcionar con gcc 4.7.2 – kfmfe04

3

QT tiene una forma primitiva de reflexión, es probable que desee tomar un botín en ella.

+0

Ok lo haré :) ¿Por qué es primitivo? –

+0

Bueno, está lejos de la flexibilidad de otros lenguajes, como Java y C#. También solo funciona en clases heredadas de QObject. No sé sobre otras restricciones. –

3

Bueno dependiendo de lo que está buscando, usted puede construir su propia sábana de pitón y pitón sonido metálico enlaces. Hay algunos ejemplos, como el mío https://github.com/nevion/metapod, existen otros si recoges lo suficiente y de alguna manera esto es lo que hace la herramienta MOC de Qt, excepto que el sonido metálico hace la tarea mucho más fácil. Una de las cosas buenas de este enfoque es que funciona para todos los compiladores porque solo está generando código estandarizado con plantillas de mako, pero esto también significa que no es totalmente automático, por lo que hay una compensación y no se ocupará de cada metaprogramación. necesidad de reflexión Como dijo Charles Salvia, C++ no es el mejor lenguaje para la reflexión, así que debes tomar lo que puedas obtener.