Let us say I want to automatically define subtraction given that addition and negation are defined. I tried the following using mixin templates. If I simply mixin the template using "mixin sub;", then it gives the error

tmpmixin.d(29): Error: incompatible types for ((a) - (b)): 'A!0' and 'A!0'

I found out that mixin using an identifier for template mixins and then using an alias declaration as in the code given below can be used to bring in overloads. But, this produces the error.

tmpmixin.d(23): Error: alias tmpmixin.A!0.A.opBinary conflicts with template tmpmixin.A!0.A.opBinary(string op : "+")(in A other) at tmpmixin.d(14) tmpmixin.d(29): Error: template instance tmpmixin.A!0 error instantiating

As you can see, there is no conflict logically. One defines addition and the mixin defines subtraction.

What is the right way to do this?

mixin template sub()
{
    alias T = typeof(this);

    T opBinary(string op : "-")(in T other) const
    {
        return this + (-other);
    }
}

struct A(int x)
{
    int a;
    A opBinary(string op : "+")(in A other) const
    {
        return A(this.a + other.a);
    }
    A opUnary(string op : "-")() const
    {
        return A(-a);
    }
    mixin sub ops;
    alias opBinary = ops.opBinary;
}

void main()
{
    import std.stdio : writeln;
    auto a = A!0(5), b = A!0(6);
    writeln(a-b);
}

Reply via email to