Question

La plupart des projets C ++ matures semblent avoir leur propre système de réflexion et d'attributs , c'est-à-dire pour définir les attributs accessibles par chaîne et automatiquement sérialisables. Au moins de nombreux projets C ++ auxquels j'ai participé semblaient réinventer la roue .

Connaissez-vous des bonnes bibliothèques open source pour C ++ prenant en charge les conteneurs d'attributs et de réflexion, notamment:

  • Définition du RTTI et des attributs via des macros
  • Accès au RTTI et aux attributs via le code
  • Sérialisation automatique des attributs
  • Écouter l'attribution de modifications (par exemple, OnValueChanged)
Était-ce utile?

La solution

Vous pouvez consulter les deux outils ci-dessous. Je ne les ai jamais utilisés, je ne peux donc pas vous dire à quel point ils sont pratiques.

XRTTI :

  

Xrtti est un outil et une bibliothèque C ++ qui l’accompagne, qui étend le système de types d’exécution standard de C ++ afin de fournir un ensemble beaucoup plus riche d’informations de réflexion sur les classes et les méthodes permettant de manipuler ces classes et leurs membres.

OpenC ++ :

  

OpenC ++ est une bibliothèque frontend C ++ (lexer + analyseur + DOM / MOP) et un traducteur source à source. OpenC ++ permet de développer des outils de langage C ++, des extensions, des optimisations de compilateur spécifiques à un domaine et des protocoles de métaobjets d’exécution.

Autres conseils

C’est ce que vous obtenez lorsque C ++ rencontre Reflection:

C ++ rencontre la réflexion

Quoi que vous choisissiez, il y aura probablement des macros horribles, des difficultés de débogage du code ou des étapes de construction bizarres. J'ai vu un système générer automatiquement le code de sérialisation à partir du fichier PDB de DevStudio.

Sérieusement, pour les petits projets, il sera plus facile d'écrire des fonctions de sauvegarde / chargement (ou d'utiliser des opérateurs de diffusion en continu). En fait, cela pourrait également s’appliquer aux grands projets. C’est clair ce qui se passe et il est généralement nécessaire de changer le code de toute façon si la structure change.

Un nouveau projet fournit une réflexion en C ++ selon une approche totalement différente: CAMP . https://github.com/tegesoft/camp

CAMP n'utilise pas de précompilateur, les classes / propriétés / fonctions / ... sont déclarées manuellement à l'aide d'une syntaxe similaire à boost.python ou luabind. Bien sûr, les personnes peuvent utiliser un précompileur tel que gccxml ou open-c ++ pour générer cette déclaration si elles préfèrent.

Il est basé uniquement sur le C ++ pur et les en-têtes boost, et grâce à la puissance de la méta-programmation des modèles, il prend en charge tout type d'entité pouvant être liée (l'héritage et les constructeurs étranges ne posent pas de problème, par exemple).

Il est distribué sous la licence MIT (anciennement LGPL).

J'ai regardé ces choses pendant un moment, mais elles ont tendance à être très lourdes. Ils pourraient vous empêcher d’utiliser l’héritage, d’avoir des constructeurs étranges, etc. etc. En fin de compte, ils sont devenus un fardeau trop lourd au lieu d’être une commodité.

Cette approche d’exposition des membres que j’utilise maintenant est assez légère et vous permet d’explorer une classe pour la sérialisation ou de définir tous les champs appelés "x". à 0, par exemple. C'est également déterminé statiquement, donc c'est très très rapide. Aucune couche de code de bibliothèque ou code-gen ne vous inquiétez au sujet de la manipulation du processus de construction. Il généralise les hiérarchies de types imbriqués.

Configurez votre éditeur avec des macros pour automatiser l'écriture de certaines de ces choses.

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 << " ";
     }
}

regardé cela pendant un moment aussi. Actuellement, la solution la plus simple semble être BOOST_FUSION_ADAPT_STRUCT . Pratiquement une fois que vous avez une bibliothèque / en-tête, il vous suffit d’ajouter vos champs de structure dans la macro BOOST_FUSION_ADAPT_STRUCT (), en tant que dernier segment du code. montre . Oui, il y a des restrictions que beaucoup de gens ont mentionnées. Et cela ne supporte pas directement les auditeurs.

Les autres solutions prometteuses que j'ai examinées sont

  • CAMP et XRTTI / gccxml, cependant, ils semblent tous deux être un obstacle à la dépendance aux outils externes dans votre projet.
  • Il y a des années, j'utilisais perl c2ph / pstruct pour supprimer les informations méta du fichier sortie de gcc -gstabs , qui est moins intrusive mais nécessite plus de travail bien que cela ait parfaitement fonctionné pour moi.

En ce qui concerne l’approche boost / __ cxa, une fois que vous avez compris tous les petits détails, l’ajout / la modification de structures ou de champs est simple à gérer. nous l'utilisons actuellement pour créer une couche de liaison de types personnalisés au-dessus de dbus, pour sérialiser l'API et masquer les détails de transport / RPC d'un sous-système de service d'objet géré.

Pas général, mais QT le supporte via un méta-compilateur, et est la GPL. D'après ce que j'ai compris après avoir parlé aux gens de QT, cela n'était pas possible avec du C ++ pur, d'où la nécessité du moc.

C’est une faiblesse notoire du langage C ++ en général, car les éléments à normaliser pour rendre les implémentations de réflexion portables et rentables ne sont pas standard. Les conventions d’appel, la disposition des objets et la manipulation de symboles me viennent à l’esprit, mais il en existe d’autres également.

Le manque d’orientation par rapport à la norme signifie que les développeurs de compilations agissent différemment, ce qui signifie que très peu de gens sont motivés pour écrire une bibliothèque de réflexions portable, ce qui signifie que ceux qui ont besoin de réflexions réinventent la roue. juste assez pour ce dont ils ont besoin. Cela se produit ad infinitum , et nous y sommes.

Boîte à outils introspection / réflexion automatique. Utilisez le méta-compilateur comme Qt's et ajoutez les méta-informations directement dans les fichiers objets. Intuitif facile à utiliser. Aucune dépendance externe. Même autoriser automatiquement refléter std :: string et ensuite l'utiliser dans les scripts. Consultez la page IDK

.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top