On Tue, 31 May 2011 19:32:59 -0400, Nick Sabalausky <a@a.a> wrote:

"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;
}

I think there are certain special situations where you can use typeof(this). For example, as the return type for a static method.

*looks for doc*  Couldn't find any documentation on it...

It's somewhat like static this, which is inflexible in how you write it.

-Steve

Reply via email to