On Monday, 24 June 2013 at 15:46:05 UTC, Steven Schveighoffer
wrote:
On Sun, 23 Jun 2013 11:29:10 -0400, Lemonfiend <[email protected]>
wrote:
On Sunday, 23 June 2013 at 15:15:16 UTC, Jacob Carlborg wrote:
On 2013-06-23 13:26, Lemonfiend wrote:
foreach (I i; array) {
if (B b = cast(B) i) { ... }
}
Thanks all 3 of you for the quick and identical answers. :)
It had not occurred to me to use a cast for this, but indeed
the
language ref says the same:
"In order to determine if an object o is an instance of a
class B use a
cast"
It does a bit inelegant to me.. Or are casts simply
extremely cheap?
You can do something like this as well:
if (i.classinfo is B.classinfo) { }
But doing the cast is more efficient if you want to use the
object of as the type you're checking for.
Using the .classinfo is what I looked at before asking here.
However, according to the specs:
".classinfo applied to an interface gives the information for
the interface, not the class it might be an instance of."
So the i.classinfo and B.classinfo would be different?
1. Use typeid(i), not i.classinfo, classinfo is old-style.
2. Yes, typeid(i) will give you interface class info, or maybe
even derived interface class info. It's a simple indirection,
whereas a cast must go through a pointer offset stored in the
interface typeinfo in order to get true class info.
3. typeid(i) on one DLL may be different than typeid(i) on
another. It is not valid to compare the references directly
On 2, see test code:
http://dpaste.dzfl.pl/97f5866d
-Steve
This method would not work for my example, since it would get the
interface, not a class.
But if I were to maintain an array of some base class instead, it
would.
Very interesting! Thanks.