alias MT = MyStruct!int; struct MyStruct(T) { T x; this(T y) { x = y; } MyStruct!T opBinary(string op)(MyStruct!T y) const { alias C = typeof(return); auto w = C(this.x); return w.opOpAssign!(op)(y); } MyStruct!T opBinaryRight(string op)(MyStruct!T y) const { return opBinary!(op)(y); } ref MyStruct opOpAssign(string op, T)(const MyStruct!T z) { mixin ("x "~op~"= z.x;"); return this; } MyStruct!T opBinary(string op)(T y) const { alias C = typeof(return); auto w = C(this.x); return w.opOpAssign!(op)(y); } MyStruct!T opBinaryRight(string op)(T y) const { return opBinary!(op)(y); } ref MyStruct opOpAssign(string op, T)(const T z) { mixin ("x "~op~"= z;"); return this; } } void test() { MT s = MyStruct!int(1); MT[] arr = [s, 2 * s, 3 * s, 4 * s, 5 * s, 6 * s]; MT[] result = new MT[arr.length]; result[] = arr[] + s; result[] = s + arr[]; result[] = arr[] - s; result[] = s - arr[]; result[] = arr[] * s; result[] = s * arr[]; result[] = arr[] / s; result[] = s / arr[]; result[] = arr[] ^^ s; result[] = s ^^ arr[]; }