有一段时间,我对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
}
}
如果它能够正常工作,那么这将是一段美妙的代码,因为它在一个方法中重载了所有 +=、-=、*= 等运算符。但是,正如您所看到的,它并不能直接运行。我已经使用模板创建了一个解决方案(天哪,我爱 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);
}
}
这很好,但我更喜欢将所有内容“内部处理”。有没有方法可以在不使用模板的情况下使其工作?我知道我在挑剔,因为没有性能损失,并且在需要这样做的情况下导入模块并不困难。我只是想知道它是否内置在其中,而我忽略了某些东西。
static if
在else
之后不会继续执行后面的if
。您必须再次重复static
。 - Bolpat