On Saturday, 12 October 2013 at 08:40:42 UTC, Jonathan M Davis wrote:
On Saturday, October 12, 2013 10:24:13 luminousone wrote:
1.

opCast, and alias can break the cast approach. You pointed this
out yourself.

And as I pointed out, that's perfectly acceptable in most cases, because what you care about is the conversion. alias this is specifically designed with the idea that you can subtype a struct or class with it. Checking with typeid to get the exact type would be circumventing that design. So, casting is almost
always the correct option.

2.

The requested function is testing types not instance state.

bool instanceOf(A,B)( B value ) {
         assert( value !is null );
         return inheritsFrom(A,typeof(value));
}

Fine. That doesn't invalidate casting to check an instance. They're two
different things.

3.

Cast breaks on null, so this must be checked on every call, and
leads to a 3 state outcome, true, false, and null, null then
returns false, which is potentially incorrect and could cause odd
bugs hard to trace.

null is _supposed_ to be false. The whole point is to check whether the object in question can be used as the type that you're casting to. If it's null, it isn't the type that you're casting to - it's null. So, false is exactly what it should be doing. It's specifically designed so that you can do

if(auto c = cast(MyClass)obj)
{
    ...
}

Again it is bad practice regardless of what any document says.

And I completely disagree. Casting is doing precisely what it's designed to
do, and I really don't see a problem with it.

- Jonathan M Davis


1.

Your hand waving corner cases.

2.

Your throwing away perfectly good opportunities for the compiler to use CTFE by depending on allocated instance state(or at least its address) to get your answers.

To say nothing of the fact, that reflection won't have the list of corner case problems that casting does.

Reflection is simply correct in more cases then casting for this activity, it is also more generic, and requires fewer function parameters.

3.

Hardly, casting null works perfectly fine in c and c++, D strives towards more correct code, its one of the things I love about the language.

It is precisely because D checks null on cast, that creates the potential ternary return. A corner case I grant you, but still.

Further D being a statically typed language, it could very well be argued, that a nulled reference, still has a type.

meaning...

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

would be more correct then using typeOf(value) version above.

Reply via email to