しばらくの間、Dの演算子のオーバーロードの方向について混乱していましたが、今ではそれが美しいシステムであることに気付きました...コアタイプ(int、floatなど)でのみ機能する場合。次のコードを検討してください。
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
Y.opOpAssign!op(vector.Y); // ERROR: ditto
}
}
これは、1つのメソッドですべての+ =、-=、*=などの演算子をオーバーロードするので機能する場合は美しいコードになります。ただし、ご覧のとおり、そのままでは機能しません。テンプレートを使用してソリューションを作成しました(Dが大好きです):
template Op(string op, T) {
void Assign(ref T a, T b) {
static if (op == "+") a += b;
else if (op == "-") a -= b;
else if (op == "*") a *= b;
else if (op == "/") a /= b;
}
}
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
Op!(op, typeof(X)).Assign(X, vector.X);
Op!(op, typeof(Y)).Assign(Y, vector.Y);
}
}
これは問題ありません。すべてを「社内」に保管したいのは私だけです。テンプレートを使用せずにこれを機能させる方法はありますか?パフォーマンスの低下はなく、これを行う必要がある状況でモジュールをインポートするのは難しくないので、私はここで気難しいことを知っています。内蔵されているのかと思っていて、何かを見落としています。