"Nick Sabalausky" <a@a.a> wrote in message news:is3tk5$1j2n$1...@digitalmars.com... > "Timon Gehr" <timon.g...@gmx.ch> wrote in message > news:is3rb5$1g32$1...@digitalmars.com... >> >> It works for me. Are you sure you did not accidentally break some other >> part of >> your __traits(compiles,...) ? >> >> My minimal test case: >> >> template isIGizmo(T){enum isIGizmo=__traits(compiles,{static >> assert(T._this_implements_interface_IGizmo);});} >> >> mixin template declareInterface(string interfaceName){ >> mixin(`enum _this_implements_interface_`~interfaceName~`=true;`); >> mixin(`static assert( >> >> is`~interfaceName~`!(typeof(this)), >> >> "This type fails to implement `~interfaceName~`" >> >> );` >> ); >> } >> >> struct Gizmo{mixin declareInterface!"IGizmo";} >> >> static assert(isIGizmo!Gizmo); >> >> void main(){} >> > > Hmm, something screwey seems to be going on. Your test example works for > me too, but I could swear I've checked and double-checked everything > (including the "__traits(compiles,...)") , and made your test case and my > example as close to each other as I can, and I still can't seem to narrow > down what's different. > > I do know this: In my code, I can't use typeof(this) because the compiler > complains that "this" is only valid inside a member function. I have no > idea why doing that seems to work, even for me, in your test case. >
I think typeof(this) just seems to be screwy. Check this out: struct Gizmo { static assert( is(typeof(this)==Gizmo) ); } void main() {} Error: static assert (is(typeof(__error) == Gizmo)) is false But this is fine: struct Gizmo { alias typeof(this) Foo; typeof(this)* ptr; }