Is there a better way to use the new operator overloading than string mixins?
Also the following code strangely yields: dsfml\system\vector2.d(47): Error: variable dsfml.system.vector2.Vector2!(float).Vector2.op only parameters or foreach declarations can be ref /// element-wise operations, +, -, ref Vector2 opBinary(string op)(ref Vector2 v) { mixin("return Vector2!(T)( cast(T)(x " ~ op ~ " v.x), cast(T)(y " ~ op ~ " v.y) );"); } Removing ref from the return type makes it compile. Furthermore the assignment operator seems to be rewritten as opBinary instead of opAssign as the docs state: Vector2f _pos = Vector2f(0.f, 0.f); yields: Error: template instance opBinary!("=") matches more than one template declaration This also shows another problem. It can't distinguish between these two: Vector2 opBinary(string op)(ref Vector2 v) if (op != "*") { mixin("return Vector2!(T)( cast(T)(x " ~ op ~ " v.x), cast(T)(y " ~ op ~ " v.y) );"); } Vector2 opBinary(string op)(int i) { mixin("return Vector2!(T) ( cast(T)(x " ~ op ~ " i), cast(T)(y " ~ op ~ " i) );"); } even though vec1 + vec2 resp. vec + 5 is unambiguous.