On Tue, Jan 27, 2015 at 04:38:57AM +0000, David Monagle via Digitalmars-d-learn wrote: > 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; > } > }
Try this: class Parent { @property string typeName() { return typeid(this).toString(); } } > class Child : Parent { > } > > void main() { > auto p = new Parent; > auto c = new Child; > assert(p.typeName == "Parent"); > assert(p.typeName == "Child"); Bug: the second assert should have c.typeName. :-) But I got what you mean. > } > > > 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? typeof(this) is evaluated at compile-time. To get runtime information, you need to use typeid(). Of course, with my suggested change your code still won't work as-is, because typeid().toString() returns a fully-qualified name, so if your source file is test.d, it would return "test.Parent" and "test.Child". But you should be able to work with that. :-) T -- The volume of a pizza of thickness a and radius z can be described by the following formula: pi zz a. -- Wouter Verhelst