On Wednesday, 22 August 2018 at 11:58:25 UTC, XavierAP wrote:
When I want to have the same operator overloading code in both
types however, I can't make it work:
From https://dlang.org/spec/operatoroverloading.html#binary:
"the one with the ‘better’ match is selected. It is an error for
both to equally match."
Since both your opOpAssigns match equally, the compiler throws
up. The solution is to add some sort of restriction:
struct S1 {
mixin opOver;
}
struct S2 {
mixin opOver;
}
mixin template opOver() {
auto opOpAssign(string op, T)(T rhs)
if (T.stringof > typeof(this).stringof) { // Here
import std.stdio;
writeln(this, op, rhs);
}
}
unittest {
S1 a;
S2 b;
a += b;
}
And a final try with a global templated function instead of a
mixin template:
/********************/
private void opOpAssign(string op, Tthis, T)(ref Tthis that,
const ref T x)
This syntax would either enable the definition of operators on
builtin types that shouldn't have them, or be perceived as
inconsistent, so invasive operator overloading is used in D
instead.
--
Simen