void apply(const Visitable& v, const Argument& arg) { VisitorWithArgument t(arg); v.accept(t); }
void apply(const Visitable& v, const Argument1& arg1, const Argument2& arg2) { VisitorWith2Arguments t(arg1, arg2); v.accept(t); }
void apply(const Visitable& v) { static Visitor t; v.accept(t); }
typename GeneralQuestion::type ask(const Visitable& v, const Argument& arg) { GeneralQuestion t(arg); v.accept(t); return t.answer; }
typename GeneralQuestion::type ask(const Visitable& v) { GeneralQuestion t; v.accept(t); return t.answer; }