On Thursday, 19 December 2024 at 18:49:28 UTC, sfp wrote:
Subject lines says it all, I think... The choice to make binary operators implementable only via this `opBinary` template means it's unclear how to get virtual operators on an interface. E.g., this toy example *does* compile:``` interface Scalar { Scalar opBinary(string op)(Scalar rhs); // wrong }class Int : Scalar { int i; this(int i) { this.i = i; } Int opBinary(string op)(Int rhs) if (op == "+") { return new Int(i + this.i); } } void main() { Scalar one = new Int(1); Scalar two = one + one; } ```
The template methods in the interface need to be implemented within the interface.
https://dlang.org/spec/interface.html#method-bodies ```d interface Scalar { Scalar opBinary(string op)(Scalar rhs) if (op == "+") { return add(rhs); } Scalar add(Scalar rhs); } class Int : Scalar { int i; this(int i) { this.i = i; } Scalar add(Scalar rhs) { return new Int((cast(Int)rhs).i + this.i); } } void main() { Scalar one = new Int(1); Scalar two = one + one; } ```
