runtime type and that bizarre "is()"

Jonathan M Davis jmdavisProg at gmx.com
Sun Nov 14 04:09:22 PST 2010


On Sunday 14 November 2010 03:45:12 spir wrote:
> Hello,
> 
> 
> Is there a way to check the runtime type of an element? Meaning, for
> instance, process differently according to the actual type in a hierarchy?
> 
> class C {}
> class C1 : C {int i;}
> bool checkTypeC1 (C c) {
>     return is(typeof(c) == C1);
> }
> void main () {
>     C1 c1 = new C1();
>     writeln(is(typeof(c1) == C1));  // true, indeed!
>     writeln(checkTypeC1(c1));       // false!
>     C c = new C1();
>     writeln(is(typeof(c) == C1));   // false!
> }
> 
> If, above, checktype is actualy a func that does more according to c's type
> (or is called by a func that does more), then it bugs. Should one write
> overloaded versions of the func depending on param type? But what about
> common parts of the process (sometimes, the difference is tiny)? One can
> factorise out into an additional func, but then there is func call
> overhead, and the code structure gets complexified.
> 
> Also, I would like to ask about "is()". I don't understand its logics and
> uses, even after reading TDPL pages about it. Seems uselessly complicated
> and unintuitive. For instance, in the above cases, why do I need is() at
> all? Why not just "typeof(c) == C1"? or even better "typeof(c) is C1"? By
> the way, why is "is(typeof(c) is C1)" refused by the compiler? It's more
> logical than "==", imo, as types should be compared by identity, not
> value. (For instance, 2 structs or classes that happen to define
> identically named and typed fields are _not_ the same, unique, type.)

If you are dealing with a class hierarchy and you want to know whether a base 
class reference referes to a particular derived class object, I believe that the 
correct way to do it is cast it to the derived type and check whether it is 
null. If it's non-null, then it is that derived type. If it's null, then it 
isn't.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list