diff --git a/src/expr.d b/src/expr.d index 408129b..e28afec 100644 --- a/src/expr.d +++ b/src/expr.d @@ -1,5 +1,6 @@ import std.conv; import std.stdio; +import std.meta : AliasSeq; import taggedalgebraic; @@ -13,13 +14,16 @@ abstract class Expr{ R visit(Literal expr); R visit(Unary expr); } - abstract string accept(Visitor!string visitor); + private alias rTypes = AliasSeq!(string); + static foreach(T; rTypes) + abstract T accept(Visitor!T visitor); private template defCtorAndAccept(){ this(Args...)(auto ref Args args){ static foreach(i, a; args) this.tupleof[i] = a; } - override string accept(Visitor!string visitor) => visitor.visit(this); + static foreach(T; rTypes) + override T accept(Visitor!T visitor) => visitor.visit(this); } static class Binary : Expr{