Bonjour à tous,

Depuis un petit moment je met en place un... "Pattern" si je puis dire concernant un ECS.
Pour le moment, et grâce à l'aide du forum, j'ai pu mettre en place la partie "Entity" et "Component". Afin de pouvoir m'y retrouver dans tout ça, voici globalement les fonctionnalités du code :
* Entity : pour moi, une entité est composée de (au moins) deux choses, une clé principale ainsi qu'un bitset faisant office de signature quant aux différents types de composant attachés à cette entité
* EntityHolder : une classe permettant de stocker/récupérer/supprimer les signatures (bitsets) de chaque entité.
* Component : cette classe/structure n'existe pas en tant que telle dans ce pattern, libre à l'utilisateur de créer les données de son choix (sous forme de struct dans la mesure du possible)
* ComponentHolder : classe permettant de stocker/récupérer/supprimer les composants accompagnés d'une clé (Entité).
* Driver : le nom de cette classe pourrait probablement être choisi plus judicieusement, mais cette dernière permet à l'utilisateur de "piloter" tout le petit monde listé ci-dessus. Cette classe donne alors accès à l'utilisateur, via des fonctions membres virtual la possibilité de Créer/supprimer une entité, Lier/Ajouter/supprimer des composants relativement à l'entité à laquelle ils appartiennent.
* Utils : classe contenant des fonctions static utilitaires, permettant principalement de générer des clés uniques pour chaque entité, mais aussi des clés uniques pour chaque type de composants (ces clés uniques sont liées aux entités lors de leurs créations, et les clés uniques relatives aux différents types de composants permettent de modifier le bitset des entités à chaque ajout/suppression des composants.

La suite logique à tout cela est alors de venir y greffer la fonctionnalité "Systems" (le S de ECS ). Affin de remplir ce rôle, je vais donc, comme le suggérais Koala1 dans un précédent post, utiliser le "pattern" Signal/slot".
Globalement, il ne s'agit finalement "Que" de réaliser un container de std::function variadic templatées (vous devinez ce que je veux dire) que j'arrive aisément à lier aux différentes clés (entités).
Un petit essai parallèle me fait me rendre compte que ces quelques lignes de code permettent un style de programmation très fun... Pour ceux qui ne connaissent pas, je vous invite à essayer.

Cependant, ce qu'il me reste à faire, c'est de trouver un moyen de comparer les types envoyés à un variadic template avec le bitset des entités. Dans un premier temps, et afin de m'assurer que l'on utilise les bonnes clés, j'imagine utiliser exactement la même fonction permettant d'obtenir les clés de types. Cependant, il faut que je puisse boucler sur cette fonction avec chaque type d'un variadic template, uns par uns, et ça, j'ai besoin de trouver comment faire....

Si quelqu'un sait a une idée de la manière de réaliser, je prends volontiers son idée ^^.
Si quelqu'un à dans son chapeau un moyen plus sure de réaliser la comparaison, je prends aussi.

D'avance, merci pour vos retours.

EDIT : j'ai vu que l'on pouvait accéder aux différents types avec typename Selector<0, Args...>::type; mais je me demande tout de même s'il n'existe pas de meilleure solution...