Documentation
Ref-CPP est une bibliothèque d'en-tête uniquement qui fournit des capacités de réflexion et d'introspection à temps de compilation vers C ++. En codant pour les métadonnées de type dans le système de type, Ref-CPP vous permet de traiter les types et leurs champs et fonctions via la métaprogrammation constexpr et le modèle.
Utiliser le reflem-CPP dans votre projet? Je veux en entendre parler: contactez-moi par e-mail (voir mon profil), ouvrez un problème ou ajoutez la balise # réfri-CPP à vos sujets!
Vous avez une question? Essayez de demander dans le canal Gitter.
Vous voulez prendre en charge le reflem-CPP? Pensez à faire un don.
Ref-CPP vise à fournir un système de réflexion générique suffisamment flexible pour répondre à vos besoins tout en maintenant une surface d'API relativement petite.
Quelques belles choses Ref-CPP prennent en charge la boutique:
std::tuple S associé aux types et descripteurs membresproxy<T> avec les mêmes membres que T qui peuvent être utilisés pour envelopper ou étendre les fonctionnalitésImplémenter un système de sérialisation simple - Exemple-serialization.cpp - Voir dans Compiler Explorer implémente une procédure de sérialisation générique efficace à partir de zéro
Abstraction de la base de données SQL simple - Exemple-dao.cpp - View dans Compiler Explorer implémente un système ORM de base qui peut générer des instructions SQL au moment de la compilation à partir de classes de modèle en utilisant des propriétés personnalisées
Itérer les classes de base avec bases<> - Exemple-héritage.cpp - Voir dans Compiler Explorer utilise les bases<> Attribut pour itérer sur les classes de base d'un type
Accédez aux informations de réflexion à l'exécution - Exemple-custom-rtti.cpp - View dans Compiler Explorer implémente une abstraction d'exécution de base sur le reflète-CPP qui donne accès aux métadonnées de réflexion à l'exécution via des objets de métadonnées personnalisées
GUI basée sur XML avec des propriétés fortement des types - Exemple-Binding.CPP - Voir dans Compiler Explorer implémente un système de lecture de ressources XML avec Ref-CPP, en construisant une couche de réflexion d'exécution personnalisée au-dessus du Ref-CPP
Implémentation d'une classe générique Builder Factory - Exemple-builders.cpp - View dans Compiler Explorer définit une classe builder<T> , qui implémente le modèle de générateur pour tout type T .
Convertir les champs en méthodes d'accessoire - Example-Proxy.cpp - View dans Compiler Explorer utilise la fonction proxy pour créer un type générique value_proxy<T> qui expose tous les champs de T à travers des méthodes d'accessoires
Afficher un tableau de structures comme une structure de tableaux - Exemple-structure-arrays.cpp - View dans Compiler Explorer utilise la fonction proxy pour créer un type générique struct_of_arrays<T> qui stocke tous les membres de T dans std::vector , mais a également un T operator[](int) qui construit les objets individuels à la demande
Générer une structure de std::optional - Exemple-parties.cpp - Voir dans Compiler Explorer utilise la fonction proxy pour créer un type générique partial<T> qui enveloppe tous les membres de T dans std::optional
J'ai commencé à développer Ref-CPP au cours de ma dernière année au lycée. J'étais censé étudier pour les examens, mais je venais de lire la proposition originale de réflexion statique (2017), et après avoir réalisé que cela n'arrivait pas de sitôt, j'ai décidé que je devais essayer de saisir autant de ces fonctionnalités dans une bibliothèque de compilation.
La bibliothèque a grandi et a beaucoup changé depuis les premiers jours, mais même après plusieurs années, je n'ai toujours pas vu une autre bibliothèque de réflexion qui prend en charge la métaprogrammation Consxpr et le modèle. Avec d'autres bibliothèques, vous devez souvent parcourir une structure de métadonnées au moment de l'exécution, invoquer les pointeurs de la fonction et utiliser le type de type. Avec Ref-CPP, vous traitez les métadonnées de type au moment de la compilation, via pour les boucles for_each , tous les types sont là, et le compilateur peut souvent tout alimenter et générer le même code que vous auriez écrit à la main.
Toutes les fonctions utilitaires dans Ref-CPP sont constexpr (sauf celles de refl::runtime ). Les compilateurs en inserteront généralement toutes les boucles et autres constructions (lors de l'utilisation -O2 ) et généreront du code qui s'exécute aussi rapidement que s'il était écrit à la main.
Grâce à certaines optimisations spéciales de temps de compilation, les métadonnées de type ne sont généralement pas instanciées (aucune génération de code ne doit se produire) lorsque les types eux-mêmes ne sont pas utilisés dans la réflexion. Avec 0,12,2, il y a également eu des réductions majeures du temps de compilation lors de l'utilisation des propriétés # 60.
Cela étant dit, un mot d'avertissement: j'ai observé qu'après les 250 membres reflétés, les temps de compilation commencent à croître rapidement. Si votre base de code contient de nombreuses classes énormes (+250 fonctions) et que vous devez tous les refléter avec refl-cpp , il pourrait s'agir d'un disjoncteur - Benchmark avant l'utilisation.
Pour utiliser Ref-CPP comme bibliothèque à un seul tête, copiez include/refl.hpp à votre répertoire inclue.
Vous pouvez également consommer Ref-CPP en tant que CMake Depency (3.14+ requis, merci @friendlyanon).
vcpkg install refl-cpp (merci @vennor)conan install refl-cpp La documentation en ligne est construite avec Doxygen. Exécutez doxygen Doxyfile dans docs/ pour le mettre à jour.
Exécutez CMake avec -Drefl-cpp_DEVELOPER_MODE=ON et effectuez la cible refl-cpp-tests .
Exécutez CMake avec -Drefl-cpp_DEVELOPER_MODE=ON Flag. Vous pouvez également configurer un préréglage personnalisé pour une expérience de développeur plus pratique (voir ce commentaire sur # 44).