InstanceOf
Lemonfiend
lemon at fie.nd
Mon Jun 24 12:49:25 PDT 2013
On Monday, 24 June 2013 at 15:46:05 UTC, Steven Schveighoffer
wrote:
> On Sun, 23 Jun 2013 11:29:10 -0400, Lemonfiend <lemon at fie.nd>
> 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.
More information about the Digitalmars-d-learn
mailing list