Bonjour,
Après avoir étudié à peu près l'ensemble du moteur d'Unreal (Warfare, celui d'UT2003-2004 entre autres donc), je voudrais en reproduire certaines fonctionnalités.
En particulier, ce qui semble d'une efficacité remarquable dans ce moteur c'est la possibilité d'avoir un arbre de classes qui "semble" se génerer automatiquement à la compilation de nouvelles classes. Ainsi si on crée une classe héritant de Actor en UnrealScript et qu'on compile avec Wotgreal, elle sera automatiquement ajoutée à l'arbre de classes.
Idem, toujours en UnrealScript, si on appelle la fonction isA() d'une instance de classe xPawn (le diagramme d'héritage étant Actor <- Pawn <- xPawn) elle retourne vrai si on lui passe le nom de l'une de ces classes. Bref Unreal génère donc vraisemblablement une liste complète des héritage de chaque classe.
La question est donc: comment générer cette liste des dépendances pour n'importe quelle classe afin de l'intégrer au final dans l'arbre de classes?
* Si c'est à l'initialisation, en runtime:
Il faudrait sans doute récupérer en runtime les noms des classes mères avec typeid() par récursion dans une fonction virtuelle qui viendrait remplir la liste de dépendances.
Un truc du genre:
Pour obtenir au final dans la classe xPawn une liste contenant "class Actor", "class Pawn", "class xPawn" ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 class Actor { protected: std::vector<string> _inheritedClassNames; virtual void recurse() { _inheritedClassNames.push_back( typeid(Actor).name() ); } }; class Pawn : public Actor { protected: void recurse() { Actor::recurse(); _inheritedClassNames.push_back( typeid(Pawn).name() ); } };
Cette approche très très simplifiée marche évidemment mais est vraiment mauvaise car:
- la génération des noms de classe, et donc celle du class tree se fait donc à l'initialisation des classes. Donc il faudrait créer au moins une instance de TOUTES les classes existantes pour que leur nom figure dans l'arbre! Pas très générique!
- il y a un énorme problème de redondance, chaque instance de classe possède le même tableau! Il faudrait peut-être le passer en static.
- mais si la liste est effectivement déclarée "static", même en utilisant des template pour automatiser l'overloading de la fonction recurse() pour chaque classe fille, l'automatisation est quand même cassée car il faut redéclarer ces fichus membres statiques dans le .cpp des classes filles.
* Si c'est à la compilation:
Aaah les joies de la métaprogrammation! J'ai vu dans l'article de Laurent Gomila sur les TypeList qu'il était possible d'effectuer des opérations telles que PushBack, Find sur ce type de structure.
Pourrait-on envisager une typelist T qui contiendrait les types de classe en question?
E.g., si on crée la classe xPawn, celle-ci auparavant déclarée typelist<Actor,Pawn> T, deviendrait typelist<Actor,Pawn,xPawn> avec un PushBack<xPawn,T> dans la déclaration de la classe?
En fait tout cela reste très obscur pour moi! Il y a peut-être même beaucoup plus simple comme approche, j'attends vos commentaires![]()
Partager