J'essaie d'imaginer une solution créative à ce problème (sur et éteindre) pendant un certain temps, mais je n'ai pas encore été capable de. J'ai récemment considéré que cela pourrait être résoluble avec des métacrogramming de modèle, bien que je ne suis pas sûr de sorte que mon manque relatif d'expérience avec la technique. P>
est-il possible d'utiliser un métaprogrammation de modèle (ou tout autre mécanisme avec la langue C ++) pour compter le nombre de classes dérivées de certaines classes de base, de sorte que chaque classe dérivée reçoive un identifiant de classe statique unique? P >
Merci d'avance! p>
3 Réponses :
non. C'est un problème qui pose beaucoup de pratique, et autant que je sache, il n'y a que deux solutions:
La façon dont vous faites le second est quelque chose comme ceci: p> Cela vous donne des identifiants uniques pour chaque classe: P> Derived3::getStaticId(); // 0
Derived2::getStaticId(); // 1
Derived1::getStaticId(); // 2
Je pose cela avec mon problème à l'esprit. Ce sera long post. Je suis en train d'écrire un système d'événements et je veux enregistrer des événements uniquement sur un endroit.
-------------- p>
#include <loki/Typelist.h> #include <loki/HierarchyGenerators.h> #include "../core/Event.h" #include "EventsTank.h" typedef Loki::GenLinearHierarchy<Loki::TL::Reverse<EventsTankAll>::Result,UnitId,EventIdGenerator> AllEvents; AllEvents allEvents;
est-il possible d'utiliser un métaprogrammation de modèle (ou tout autre mécanisme avec la langue C ++) pour compter le nombre de classes dérivées de certaines classes de base, de sorte que chaque classe dérivée reçoive un identifiant de classe statique unique? P > blockQuote>
Non, il n'y a pas de tel mécanisme. Peu importe ce que vous faites, vous devrez ajouter «quelque chose» (probablement une macro) à chaque classe dérivée
manuellement forte> pour atteindre quelque chose comme ça. Voir la macro QT 4 et Q_Object. Vous pouvez également faire une macros pour faire des classes dérivées, mais cela ne peut pas être fait automatiquement. P> vous
pourrait strong> écrivez cependant votre propre outil de préprocesseur / analyse de code C ++ qui analyse le code source que vous avez fourni, puis insère les directives nécessaires dans la source. P> En outre, RTTI fournit un nom pour chaque classe. Le problème est que ce nom est spécifique à la mise en œuvre, de sorte que ce n'est pas très utile. P>
Les ID statiques sont-ils une exigence ou avez-vous mis là-bas là parce que vous pensez qu'ils font partie de la solution? Une solution idéale à ce problème n'aurait probablement pas besoin de ces identifiants et compterait plutôt sur le système de type. C'est-à-dire que les noms de classe elles-mêmes serviraient d'identifiants statiques uniques.
J'essaie d'éviter RTTI et de rester dans C ++.
@ Danm.katz: Peut-être que j'ai fait ce que vous voulez. Publiez ici si vous êtes toujours intéressé.
Hey dragomir. Je suis absolument toujours intéressé.
@ DANM.KATZ: RTTI est i> en C ++.