That works too. I think I like the solution above better for now,
I just have to figure out how to generalise it into a template
mixin so I don't have to write it out over and over again.

Atila

On Friday, 4 April 2014 at 14:24:55 UTC, Dicebot wrote:
On Friday, 4 April 2014 at 09:22:16 UTC, Atila Neves wrote:
   enum hasAccept(T) = is(typeof(() {
       auto s = T();
       auto foo = FooVisitor();
       s.accept(foo);
       auto bar = BarVisitor();
       s.accept(bar);
   }));

I have lately started to favor separated asserts as opposed to combined constraints:

mixin template hasAccept(T)
{
    static assert (
        is(typeof(() { auto s = T(); })),
        "Can't create instance of " ~ T.stringof
    );
    static assert (
        is(typeof(FooVisitor)),
        "FooVisitor is not defined"
    );

    // .. and so on
}

It is much less elegant and does not fix issue fundamentally but speeds up debugging for end user of the library quite a lot.

Reply via email to