www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Checking runtime object type

reply "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
What's the correct syntax for checking the runtime type of a derived
object given its base class pointer? I tried:

	Base f() { return new Derived(); }
	Base b = f();
	assert(is(typeof(b)==Derived));

but it throws an error. Apparently typeof(b)==Base; so typeof returns
only compile-time information? How do I get at the runtime type?


T

-- 
"You are a very disagreeable person." "NO."
Feb 08 2012
next sibling parent Johannes Pfau <nospam example.com> writes:
Am Wed, 8 Feb 2012 11:20:39 -0800
schrieb "H. S. Teoh" <hsteoh quickfur.ath.cx>:

 What's the correct syntax for checking the runtime type of a derived
 object given its base class pointer? I tried:
 
 	Base f() { return new Derived(); }
 	Base b = f();
 	assert(is(typeof(b)==Derived));
 
 but it throws an error. Apparently typeof(b)==Base; so typeof returns
 only compile-time information? How do I get at the runtime type?
 
 
 T
 

I think using casts is the only way: Base f() { return new Derived(); } Base b = f(); auto c = cast(Derived)b; assert(c !is null);
Feb 08 2012
prev sibling next sibling parent Justin Whear <justin economicmodeling.com> writes:
On Wed, 08 Feb 2012 11:20:39 -0800, H. S. Teoh wrote:

 What's the correct syntax for checking the runtime type of a derived
 object given its base class pointer? I tried:
 
 	Base f() { return new Derived(); }
 	Base b = f();
 	assert(is(typeof(b)==Derived));
 
 but it throws an error. Apparently typeof(b)==Base; so typeof returns
 only compile-time information? How do I get at the runtime type?
 
 
 T

Yeah, is() and typeof() are purely compile-time. You'll want the typeid expression (http://d-programming-language.org/ expression.html#typeidexpression) which returns an instance of TypeInfo (http://d-programming-language.org/phobos/object.html#TypeInfo).
Feb 08 2012
prev sibling next sibling parent "Jonathan M Davis" <jmdavisProg gmx.com> writes:
On Wednesday, February 08, 2012 20:21:45 Johannes Pfau wrote:
 Am Wed, 8 Feb 2012 11:20:39 -0800
 
 schrieb "H. S. Teoh" <hsteoh quickfur.ath.cx>:
 What's the correct syntax for checking the runtime type of a derived
 
 object given its base class pointer? I tried:
 Base f() { return new Derived(); }
 Base b = f();
 assert(is(typeof(b)==Derived));
 
 but it throws an error. Apparently typeof(b)==Base; so typeof returns
 only compile-time information? How do I get at the runtime type?
 
 
 T

I think using casts is the only way: Base f() { return new Derived(); } Base b = f(); auto c = cast(Derived)b; assert(c !is null);

Casting is definitely the way that you're supposed to do it. If the cast results in null, then the class is _not_ of the type that you cast to. e.g. if(auto d = cast(Derived) b) //do stuff with d - Jonathan M Davis
Feb 08 2012
prev sibling parent "Steven Schveighoffer" <schveiguy yahoo.com> writes:
On Wed, 08 Feb 2012 14:41:51 -0500, Jonathan M Davis <jmdavisProg gmx.com>  
wrote:

 On Wednesday, February 08, 2012 20:21:45 Johannes Pfau wrote:
 Am Wed, 8 Feb 2012 11:20:39 -0800

 schrieb "H. S. Teoh" <hsteoh quickfur.ath.cx>:
 What's the correct syntax for checking the runtime type of a derived

 object given its base class pointer? I tried:
 Base f() { return new Derived(); }
 Base b = f();
 assert(is(typeof(b)==Derived));

 but it throws an error. Apparently typeof(b)==Base; so typeof returns
 only compile-time information? How do I get at the runtime type?


 T

I think using casts is the only way: Base f() { return new Derived(); } Base b = f(); auto c = cast(Derived)b; assert(c !is null);

Casting is definitely the way that you're supposed to do it. If the cast results in null, then the class is _not_ of the type that you cast to. e.g. if(auto d = cast(Derived) b) //do stuff with d

It depends on the usage. If you want to see what the most derived type is, using typeid is best (for those old-schoolers, this used to be .classinfo). If you want to *verify* that the given type is derived from some other type, using cast is best. -Steve
Feb 08 2012