On Monday, 6 August 2012 at 13:59:30 UTC, jerro wrote:
Wouldn't you have the exact same problem with implicit casts in C++? If you want to use custom operators, you should just define those, same as you would in C++. You can even implement just some operators and use alias this for functionality that you don't want to reimplement, like this:

import std.stdio;

struct A
{
    int a;
    alias a this;
    auto opOpAssign(string op, T)(T b)
        if(op == "+" && is(typeof(a += T.init)))
    {
        a += b;
        writeln("opOpAssign!\"+\" called.");
    }
}


void main()
{
    auto a = A(3);
    a += 5u;
    writeln(a);
    writeln(a - 1);
}

This prints:

opOpAssign!"+" called.
8
7

Oh... I've had a pretty longstanding misunderstanding then. I tested something like that a while ago, and didn't manage to get the custom operator called. Instead the aliased type's default operator was called. Then I assumed that's how alias this worked. I must have done something wrong back then, I don't know, can't find that test code anymore.

Reply via email to