Traits

luminousone rd.hunt at gmail.com
Fri Oct 11 14:06:53 PDT 2013


On Friday, 11 October 2013 at 19:54:39 UTC, Jonathan M Davis 
wrote:
> On Friday, October 11, 2013 21:19:29 luminousone wrote:
>> Using casts that way won't always be correct, it would be 
>> better
>> to use reflection in some way if possible.
>
> The only reason that the casts wouldn't be correct would be if 
> the class
> overrode opCast for the type that you're casting to or had an 
> alias this
> declaration for it. Using casting for "instanceOf" is 
> considered the standard
> and correct way to do it. But if you're being paranoid about 
> the possibility
> of a conversion being defined with opCast or alias this, then 
> yes, you need to
> use typeid.
>
> - Jonathan M Davis

import std.stdio;

bool instanceOf(A, B)(B value) {
         return !!cast(A)value;
}

class e {
}

class f : e {

}

class g {

}


void main() {
         int a;
         float b;
         char c;

         e E;
         f F;
         g G;

         assert( 1.instanceOf!int, "1");
         assert( a.instanceOf!int, "a"); // fails here ?!?
         assert( b.instanceOf!int, "b");
         assert( c.instanceOf!int, "c");

         assert( E.instanceOf!e  , "e"); // fails here !??
         assert( F.instanceOf!e  , "f");
         assert( G.instanceOf!e  , "g"); // fails as expected
}


Seems to be problems, at least with quick testing using rdmd. 
Using casts seems terribly hackish, I would think that some sort 
of reflection should be much safer/correct way todo this.



More information about the Digitalmars-d-learn mailing list