digitalmars.D.learn - How to get runtime type of this?
- Zhouxuan (27/27) Oct 04 2013 import std.stdio;
- Jacob Carlborg (30/57) Oct 04 2013 You can do this:
- Zhouxuan (4/68) Oct 04 2013 This is exactly what I want, thank you very much!
- Zhouxuan (2/66) Oct 04 2013 Unfortunately it doesn't work if C inherits from B.
- Dicebot (3/3) Oct 04 2013 I am afraid if you want true polymorphic behavior, `id` needs to
- Jacob Carlborg (5/6) Oct 04 2013 What you need is a template constructor in B, just as in A. But it seems...
import std.stdio; class A { static int id = 0; this() { writeln("typeid=", typeid(this)); writeln("id=",typeof(this).id); //how to get runtime type of this ?? } } class B : A { static int id = 1; } class C : A { static int id = 2; } void main() { A a = new B; A b = new C; } typeof(this) can get compile time type while typeid yield a runtime TypeInfo instance, but how to get runtime type? I want the output to be "id=1" and "id=2" respectively.
Oct 04 2013
On 2013-10-04 10:03, Zhouxuan wrote:import std.stdio; class A { static int id = 0; this() { writeln("typeid=", typeid(this)); writeln("id=",typeof(this).id); //how to get runtime type of this ?? } } class B : A { static int id = 1; } class C : A { static int id = 2; } void main() { A a = new B; A b = new C; } typeof(this) can get compile time type while typeid yield a runtime TypeInfo instance, but how to get runtime type? I want the output to be "id=1" and "id=2" respectively.You can do this: class A { static int id = 0; this(this T)() { writeln("typeid=", typeid(T)); writeln("id=",T.id); //how to get runtime type of this ?? } } class B : A { static int id = 1; this () { super(); } } class C : A { static int id = 2; this () { super(); } } void main() { A a = new B; A b = new C; } Put I'm guess you want to avoid the constructor in the subclasses. I think there's a bug report about this. -- /Jacob Carlborg
Oct 04 2013
On Friday, 4 October 2013 at 08:23:11 UTC, Jacob Carlborg wrote:On 2013-10-04 10:03, Zhouxuan wrote:This is exactly what I want, thank you very much! Redundant constructor here is not a problem, however there're so many workarounds atm.import std.stdio; class A { static int id = 0; this() { writeln("typeid=", typeid(this)); writeln("id=",typeof(this).id); //how to get runtime type of this ?? } } class B : A { static int id = 1; } class C : A { static int id = 2; } void main() { A a = new B; A b = new C; } typeof(this) can get compile time type while typeid yield a runtime TypeInfo instance, but how to get runtime type? I want the output to be "id=1" and "id=2" respectively.You can do this: class A { static int id = 0; this(this T)() { writeln("typeid=", typeid(T)); writeln("id=",T.id); //how to get runtime type of this ?? } } class B : A { static int id = 1; this () { super(); } } class C : A { static int id = 2; this () { super(); } } void main() { A a = new B; A b = new C; } Put I'm guess you want to avoid the constructor in the subclasses. I think there's a bug report about this.
Oct 04 2013
On Friday, 4 October 2013 at 08:23:11 UTC, Jacob Carlborg wrote:On 2013-10-04 10:03, Zhouxuan wrote:Unfortunately it doesn't work if C inherits from B.import std.stdio; class A { static int id = 0; this() { writeln("typeid=", typeid(this)); writeln("id=",typeof(this).id); //how to get runtime type of this ?? } } class B : A { static int id = 1; } class C : A { static int id = 2; } void main() { A a = new B; A b = new C; } typeof(this) can get compile time type while typeid yield a runtime TypeInfo instance, but how to get runtime type? I want the output to be "id=1" and "id=2" respectively.You can do this: class A { static int id = 0; this(this T)() { writeln("typeid=", typeid(T)); writeln("id=",T.id); //how to get runtime type of this ?? } } class B : A { static int id = 1; this () { super(); } } class C : A { static int id = 2; this () { super(); } } void main() { A a = new B; A b = new C; } Put I'm guess you want to avoid the constructor in the subclasses. I think there's a bug report about this.
Oct 04 2013
I am afraid if you want true polymorphic behavior, `id` needs to become a virtual getter function. D runtime reflection is quite lacking in that are.
Oct 04 2013
On 2013-10-04 10:42, Zhouxuan wrote:Unfortunately it doesn't work if C inherits from B.What you need is a template constructor in B, just as in A. But it seems it's not possible to forward the template type to the base class. -- /Jacob Carlborg
Oct 04 2013