有一段时间我对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