Bonjour,

Voici mon problème : J'essaie de faire une structure de proposition générique. C'est à dire qu'une définition usuelle de la structure de Proposition (en notation Ocaml approximatif) pourrait-être

Proposition =
|Variable(Chaine de caractere)
|AND(Proposition*Proposition)
|OR(Proposition*Proposition)
|FORALL(Variable * Proposition)
...

Mon idée est de ne pas fixer les constructeurs :
-Soit la liste des constructeurs possibles est passée en paramètre template à ma structure de Proposition (cas 1)
-Soit la liste des constructeurs possibles est passée à l'éxecution (cas 2)

Je ne sais pas encore si je veux être dans le cas 1 ou dans le cas 2 : le cas 1 apporte plus de sécurité au niveau du code et de meilleures performances (je ne sais pas encore si j'en ai besoin) mais ne permet pas à l'utilisateur de modifier les constructeurs.
Mon idée pour le cas 1 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template<typename S1, typename ...SN>
struct Prop
{
   S1* cons;//NULL if not this constructor
   Prop<...SN> othercases;
};
Avec le constructeur X qui deviendrait

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
struct X
{
   std::string name = "X";
   Type1 parameter1;
   Type2 parameter2;
   ...
   TypeN parameterN;
};
Il me semble que ceci fonctionnerait mais serait très désagréable à utiliser. Avez-vous une autre solution à proposer (ou une raison pour laquelle ceci ne marcherait pas ?)

Pour le cas 2, je ne vois pas d'autre manière que de passer par des void* et de définir un int pour chacun des types utilisables... :
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
 
enum TypeID
{
   INT, PROP, CHAR, STRING, VARIABLE, ...
}
 
struct Constructor
{
    std::vector<TypeID> parameters;
    std::string name;
};
 
std::vector<Constructor> constructorList;
 
struct Prop
{
   Constructor c;
   void*data;//Qu'on interprète à partir des types de c
};
Y a t-il une meilleur implémentation à laquelle vous pensez ?

Merci pour votre aide.