digitalmars.D.learn - How can I make typeof(this) return the type of a calling derrived
- Lester (15/15) Jun 16 2017 If I have something like the following:
- Milan Suk (16/31) Jun 16 2017 What about something like this?
- Adam D. Ruppe (13/16) Jun 16 2017 try one of these:
- Lester (3/3) Jun 16 2017 Thanks for the responses guys :)
If I have something like the following: class A { void foo(){ writeln(typeof(this)); } ... } class B : A { ... } And I want the results: A a = new A; B b = new B; a.foo(); // prints "A" b.foo(); // prints "B" How would I go about doing that? At the moment b.foo() is printing "A".
Jun 16 2017
On Friday, 16 June 2017 at 13:46:14 UTC, Lester wrote:If I have something like the following: class A { void foo(){ writeln(typeof(this)); } ... } class B : A { ... } And I want the results: A a = new A; B b = new B; a.foo(); // prints "A" b.foo(); // prints "B" How would I go about doing that? At the moment b.foo() is printing "A".What about something like this? class A {} class B : A {} void foo(T)(T object) { import std.stdio : writeln; writeln(object.classinfo.toString); // you can use whatever property you want... } void main() { A a = new A; B b = new B; a.foo(); // prints "test.A" b.foo(); // prints "test.B" }
Jun 16 2017
On Friday, 16 June 2017 at 13:46:14 UTC, Lester wrote:If I have something like the following: class A { void foo(){ writeln(typeof(this)); }try one of these: http://dlang.org/spec/template.html#TemplateThisParameter Though note that the this in there is still the static type at the usage point. So: B b = new B; b.foo; // B, because it is called through a B but A b = new B; b.foo; // A, because it is called through the A interface You can also do runtime stuff with typeid/classinfo (they return the same thing) or simply override the function in the child class (often preferred). Depends on exactly what you need it for.
Jun 16 2017
Thanks for the responses guys :) I ended up using a foo(this T) and it works! Thanks again for your help.
Jun 16 2017