Der wesentliche Unterschied besteht darin, dass ein Variant höchstens Typinformationen als C++ beinhalten kann. Letzendlich sind die Typen in deiner Sprache aber nicht C++ Typen. Das wird spätestens dann offensichtlich, wenn du Strukturen oder Klasse in deiner Sprache haben willst. Außerdem müssen bei einem boost::variant alle verfügbaren zur Compile Time an jeder Stelle der Verwendung bekannt sein. Mein Vorschlag war es also, wenn man ohnehin Infrastruktur für Typinformationen benötigt, die auf deine Sprache zugeschnitten sind, diese auch hier zu nutzen.
Das bringt mich leider überhaupt nicht weiter.
Ich dachte schon an einen Visitor, der statt eval das ganze korrekt auflöst, aber auch das klappt nicht ohne Änderungen an den Expressions. Was denkt ihr?
Genau das wollte ich gerade vorschlagen. Die Frage, die du dir stellen solltest, ist: Was genau will ich mit dem Rückgabewert von eval() eigentlich anstellen? Von Variants oder Structs mit TypeId würde ich abraten.
Ja, ich denke, ich werde es jetzt über einen Visitor lösen. Jede Expression bekommt eine
accept Methode, die einen Visitor annimmt. Innerhalb dieser
accept Methode übergibt sich die Expression dann selbst. So werden die Typen wieder korrekt aufgelöst.
Ein erster Test sah sehr vielversprechend aus.