9
votes

Compter avec Modèle MetaProgramming?

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.

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?

Merci d'avance!


5 commentaires

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 en C ++.


3 Réponses :


6
votes

non. C'est un problème qui pose beaucoup de pratique, et autant que je sache, il n'y a que deux solutions:

  1. attribuer manuellement des identifiants à chaque classe dérivée. LI>
  2. Générez de manière dynamique et paresseusement IDS non déterministe. LI> ol>

    La façon dont vous faites le second est quelque chose comme ceci: p> xxx pré>

    Cela vous donne des identifiants uniques pour chaque classe: P>

    Derived3::getStaticId(); // 0
    Derived2::getStaticId(); // 1
    Derived1::getStaticId(); // 2
    


0 commentaires

0
votes

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;


0 commentaires

2
votes

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?

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 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.

vous pourrait é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.

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.


0 commentaires