有一段時間我對D的運算符重載的方向感到困惑,但現在我意識到這是一個美麗的系統......如果它只適用於核心類型(int,float等)。考慮如下代碼:D中優雅的運算符重載
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
}
}
這將是美麗的代碼,如果它的工作,看到它重載所有+ =, - =,* =,等等。在一個方法運營商。但是,正如你所看到的那樣,它並不適用。我已經創建了一個使用模板(上帝我愛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);
}
}
這很好,只有我更願意將所有內容都保存在「內部」。有沒有辦法讓這項工作沒有模板的幫助?我知道我在這裏很挑剔,看到沒有性能損失,並且在我需要這樣做的情況下導入模塊並不困難。我只是想知道它是否內置,我忽略了一些東西。
注意'靜態if'不繼續以下後''else' if's。你必須重複'靜態'。 – Bolpat