On Wednesday, 24 September 2014 at 23:08:26 UTC, Adam D. Ruppe wrote:
On Wednesday, 24 September 2014 at 22:48:36 UTC, Meta wrote:
Is this supposed to work, and if not, should an enhancement be made to allow it?

It is not supposed to work - the docs don't list is as overridable (http://dlang.org/expression.html look for "Identity expressions") - and I don't think it should work either. Consider:

class A { opIs() }

if(a is null)

If that were rewritten into if(a.opIs(null))... and a were null, you'd have some trouble. Putting in an automatic null pre-check would start to complicate that is currently a simple operator.

I'm thinking more for structs, which can't be null. The only other option right now is to use alias this, but that won't work in Proxy's case. For classes, I agree it's tricky... I know we're trying to *remove* things from Object, but what if we added:

class Object
{
    static bool opIs(T, U)(inout(T) a, inout(U) b) inout
    {
        //Some implementation
    }
}

And calls to is on an object get rewritten as:

Object.opIs!(typeof(a), typeof(b))(a, b)

So `if (a is null)` becomes `if (Object.opIs(a, null))` only when a is a class. When it's a struct, it would just be rewritten as `<struct name>.opIs!T(val)`.

Reply via email to