V Tue, 27 Jan 2015 04:38:57 +0000
David Monagle via Digitalmars-d-learn
<digitalmars-d-learn@puremagic.com> napsáno:

> Hi guys,
> 
> I'm a former C++ developer and really enjoying working with D 
> now. I have a question that I hope some of you may be able to 
> answer.
> 
> class Parent {
>    @property string typeName() {
>      return typeof(this).stringof;
>    }
> }
> 
> class Child : Parent {
> }
> 
> void main() {
>    auto p = new Parent;
>    auto c = new Child;
>    assert(p.typeName == "Parent");
>    assert(p.typeName == "Child");
> }
> 
> 
> I'm looking for an explanation as to why this doesn't work, then 
> a suggestion for how I may achieve child classes being able to 
> generate a string description of their own type, without 
> redefining the typeName property on each child. (I'm currently 
> solving this with a mixin, but I was hoping for a better solution.
> 
> I'm assuming it doesn't work because either typeof(this) or 
> .stringof is evaluated at compile time?

You can use this T:

class Parent {
    @property string typeName(this T)() {
        return T.stringof;
    }
}

class Child : Parent {
}

void main() {
    auto p = new Parent;
    auto c = new Child;

    assert(p.typeName == "Parent");
    assert(c.typeName == "Child");
}

Reply via email to