org Biblioteca de reflexión C++ 11




r language binaries (4)

Actualmente voy a escribir un gran proyecto en c ++ 11.

Estoy buscando un buen tiempo en la biblioteca de reflexión de c ++ 11 / c ++ y he encontrado varias bibliotecas diferentes, pero la mayoría de ellas simplemente no están actualizadas durante los últimos dos años o su funcionalidad es muy limitada.

¿Podría decirme si hay una biblioteca realmente buena para c ++ 1 / c ++ para la reflexión? (Quiero tener una reflexión estática y dinámica, saber toda la información que pueda sobre métodos, clases, etc., puedo agregar y acceder a métodos de forma dinámica, etc.)

O tal vez c ++ 11 haya proporcionado alguna funcionalidad adicional que ayude a diseñar mejor las bibliotecas de reflexión y ¿debería escribirlo yo mismo? (Aunque no he encontrado información al respecto).


Answer #1

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 utilizando rasgos de tipo, e incluso puede usar SFINAE para determinar de manera estática si una determinada clase tiene una función miembro particular o una variable miembro. Pero eso es realmente.

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

En cuanto a la reflexión estática, la capacidad de iterar genéricamente sobre una clase y obtener cada función / variable miembro no es posible sin compromisos serios. Boost.Fusion logra lograr esto al proporcionar macros que le permiten enlazar un objeto a un contenedor similar a una tupla. De hecho, la clase std::tuple o boost::tuple proporciona reflexión en tiempo de compilación; en otras palabras, puede iterar de forma estática sobre una tupla y determinar el tipo de cada miembro. Esto le da algo parecido a la reflexión en tiempo de compilación sobre tipos agregados arbitrarios. Desafortunadamente, no es tan conveniente como si hubiera un soporte de reflexión nativo integrado para clases arbitrarias.


Answer #2

Parece que hay una biblioteca que satisface sus requisitos "amplios". Echa un vistazo a Mirror: Boost.Mirror . Tenga en cuenta que oficialmente no es parte de impulso. También puedes echar un vistazo a otras bibliotecas: Programación reflexiva .


Answer #3

QT tiene una forma primitiva de reflexión, probablemente querrás echarle un botín.


Answer #4

Bueno, dependiendo de lo que busques, puedes construir tu propio tope de python y clang python bindings. Hay algunos ejemplos, como mi propio https://github.com/nevion/metapod ; existen otros por ahí si limpian lo suficiente y de alguna manera esto es lo que está haciendo la herramienta MOC de Qt, excepto que Clang hace el tarea mucho más fácil. Una de las cosas interesantes de este enfoque es que funciona para todos los compiladores porque solo está generando código estandarizado con plantillas mako, pero esto también significa que no es completamente automático, por lo que hay una compensación y no se manejará con cada metaprogramación / necesidad de reflexión. Como dijo Charles Salvia, C ++ no es el mejor lenguaje para la reflexión, por lo que debe tomar lo que pueda obtener.





introspection