Structure Inductive dont les constructeurs ne sont pas fixés
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:
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:
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:
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.