Static override?

Atila Neves atila.neves at gmail.com
Fri Apr 4 04:43:49 PDT 2014


That gives me this:
     static_override.d(22): Error: variable 
static_override.Struct.hasAccept!(Struct).hasAccept had semantic 
errors when compiling

Which is better than before but still hiding the actuall error. 
But this works as expected:

     template hasAccept(T) {
         static iface(CT)(CT t) {
             auto foo = FooVisitor();
             t.accept(foo);
             auto bar = BarVisitor();
             t.accept(bar);
         }
         static if (is(typeof(iface!T)))
             enum hasAccept = true;
         else {
             private static void func() {
                 iface(T());
             }
         }
     }

Atila

On Friday, 4 April 2014 at 10:55:53 UTC, Artur Skawina wrote:
> On 04/04/14 11:22, Atila Neves wrote:
>>     enum hasAccept(T) = is(typeof(() {
>>         auto s = T();
>>         auto foo = FooVisitor();
>>         s.accept(foo);
>>         auto bar = BarVisitor();
>>         s.accept(bar);
>>     }));
> 
>> The static asserts are there to verify that the structs I 
>> define actually do implement the interface I want them to. 
>> Which is great when they work, but tricky to find out why they 
>> don't when the assert fails.
>
>     template hasAccept(T) {
>        static iface(CT)(CT t) {
>           auto foo = FooVisitor();
>           t.accept(foo);
>           auto bar = BarVisitor();
>           t.accept(bar);
>        }
>        static if (is(typeof(iface!T)))
>           enum hasAccept = true;
>        else
>           enum hasAccept = &iface!T;
>     }
>
> [Should probably be split into three parts: 1) the 
> if-definition, 2) the
>  does-T-implement-the-if check, and 3) the 
> T-must-implement-the-if assertion.]
>
> artur



More information about the Digitalmars-d mailing list