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