On Friday, 15 July 2016 at 17:25:23 UTC, cy wrote:
On Monday, 20 June 2016 at 16:39:54 UTC, Marc Schütz wrote:
Untested:

Seems to only work if A and B are both defined in the same file as Foos (defeating the purpose). Putting A and B in a.d and b.d respectively gives me these errors:

a.d(2): Error: undefined identifier 'Foos'
a.d(2): Error: mixin a.A.Foos!() is not defined
b.d(2): Error: undefined identifier 'Foos'
b.d(2): Error: mixin b.B.Foos!() is not defined

I also tried switching it around, like
// b.d
import foos Foos;
class B {
  mixin Foos;
}

but that of course gives the error:
foos.d(4): Error: undefined identifier 'A'
b.d(3): Error: mixin b.B.Foos!() error instantiating

since you can't do a static if(typeof(this) == A) without importing A from a somehow. (you can do else static if(typeof(this) == B) without importing B though, since it does the branch for A first)

I think a mixin here is just required, because you can't use an identifier before it's defined, even at compile time. Honestly, I have yet to find a use for mixin templates.

It works if you add forward declarations for the classes:

import a, b;
class A;
class B;
mixin template Foos() {
    static if(is(typeof(this) == A))
    void foo() { /* implementation for A */ }
    static if(is(typeof(this) == B))
    void foo() { /* implementation for B */ }
}

Reply via email to