Documentación
Refl-CPP es una biblioteca solo de encabezado que proporciona capacidades de reflexión e introspección de tiempo de compilación a C ++. Al codificar metadatos de tipo en el sistema de tipos, Refl-CPP le permite procesar los tipos y sus campos y funciones a través de Contexpr y Metaprogramación de plantillas.
¿Usando refle-cpp en su proyecto? Quiero saber al respecto: contácteme por correo electrónico (vea mi perfil), abra un problema o agregue la etiqueta #refle-cpp a sus temas.
¿Tienes una pregunta? Intente preguntar en el canal Gitter.
¿Quieres apoyar a Refl-CPP? Considere hacer una donación.
Refl-CPP tiene como objetivo proporcionar un sistema de reflexión genérico que sea lo suficientemente flexible como para satisfacer sus necesidades mientras mantiene una superficie API relativamente pequeña.
Algunas cosas bonitas que refle-cpp admite fuera de la caja:
std::tuple s asociado con tipos y descriptores de miembrosproxy<T> con los mismos miembros que T que se pueden usar para envolver o extender la funcionalidadImplementar un sistema de serialización simple - Ejemplo -serialización.cpp - La vista en el explorador del compilador implementa un procedimiento de serialización genérico eficiente desde cero
Absacción de base de datos SQL simple - Ejemplo -dao.cpp - La vista en el explorador del compilador implementa un sistema ORM básico que puede generar declaraciones SQL en el tiempo de compilación desde las clases de modelos utilizando propiedades personalizadas
Iterar las clases base con bases<> - Ejemplo -herencia.cpp - Ver en Compiler Explorer usa el atributo bases<> para iterar sobre las clases base de un tipo
Información de reflexión de acceso en tiempo de ejecución -Ejemplo-custom-rtti.cpp-Ver en el explorador del compilador implementa una abstracción básica de tiempo de ejecución sobre refle-cpp que proporciona acceso a los metadatos de reflexión en tiempo de ejecución a través de objetos de metadatos personalizados
La GUI basada en XML con propiedades de tipo fuertemente- Ejemplo de unión.cpp-Ver en Compiler Explorer implementa un sistema para leer recursos XML con refle-cpp, construyendo una capa de reflexión de tiempo de ejecución personalizada sobre Refl-cpp
Implementar una fábrica de clase Generic Builder - Ejemplo -builders.cpp - Ver en Compiler Explorer Define una clase Generic builder<T> , que implementa el patrón de constructor para cualquier tipo T .
Convertir los campos a los métodos de accesor - Ejemplo -prooxy.cpp - La vista en el explorador del compilador utiliza la función proxy para crear un tipo genérico value_proxy<T> que expone todos los campos de T a través de los métodos de accesorios
Ver una matriz de estructuras como una estructura de matrices -ejemplo-estruct-de-matrays.cpp-ver en compilador explorer usa la función proxy para crear un tipo genérico struct_of_arrays<T> que almacena todos los miembros de T en std::vector , pero también tiene un T operator[](int) que construye los objetos individuales a punto
Genere una estructura de std::optional - Ejemplo -Partials.cpp - Ver en Compiler Explorer utiliza la función proxy para crear un tipo genérico partial<T> que envuelve a todos los miembros de T en std::optional
Comencé a desarrollar Refl-CPP durante mi último año en la escuela secundaria. Se suponía que debía estar estudiando para los exámenes, pero acababa de leer la propuesta de Reflexión Estática original (2017), y después de darme cuenta de que no llegaría pronto, decidí que tenía que tratar de meter la mayor cantidad de características en una biblioteca de tiempo de compilación.
La biblioteca ha crecido y cambiado mucho desde los primeros días, pero incluso después de varios años, todavía no he visto otra biblioteca de reflexión que admita Contexpr y la metaprogramación de plantillas. Con otras bibliotecas, a menudo tiene que caminar una estructura de metadatos en tiempo de ejecución, invocar punteros de funciones y usar Tipo-Erasure. Con Refl-CPP, procesa los metadatos tipo en el tiempo de compilación, a través de los bucles for_each .
Todas las funciones de utilidad en refle-cpp son constexpr (excepto las que están en refl::runtime ). Los compiladores generalmente en línea todos los bucles y otras construcciones (cuando usan -O2 ) y generarán un código que se ejecuta tan rápido como si estuviera escrito a mano.
Gracias a algunas optimizaciones especiales de tiempo de compilación, los metadatos de tipo generalmente no están instanciados (no es necesario que ocurra ningún código de generación) cuando los tipos en sí no se usan en la reflexión. Con 0.12.2, también ha habido algunas reducciones importantes en el tiempo de compilación cuando se usan las Propiedades #60.
Dicho esto, una advertencia: he observado que después de alrededor de la marca de los 250 miembros reflejados, los tiempos de compilación comienzan a crecer rápidamente. Si su base de código contiene muchas clases enormes (+250 funciones), y necesita que todas se reflejen con refl-cpp , este podría ser un factor decisivo: punto de referencia antes de usar.
Para usar Refl-CPP como una biblioteca de un solo cabezal, copie include/refl.hpp a su directorio de incluido.
También puede consumir Refl-CPP como un Cmake dependiendo (3.14+ requerido, gracias @friendlyanon).
vcpkg install refl-cpp (gracias @vennor)conan install refl-cpp La documentación en línea está construida con Doxygen. Ejecute doxygen Doxyfile en docs/ para actualizarlo.
Ejecute cmake con -Drefl-cpp_DEVELOPER_MODE=ON y haga el objetivo refl-cpp-tests .
Ejecute cmake con -Drefl-cpp_DEVELOPER_MODE=ON el indicador. También es posible que desee configurar un preajuste personalizado para una experiencia de desarrollador más conveniente (consulte este comentario en #44).