gpt4 book ai didi

operator-overloading - D 中优雅的运算符重载

转载 作者:行者123 更新时间:2023-12-03 12:34:16 25 4
gpt4 key购买 nike

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

这很好,只是我更喜欢把所有东西都“放在家里”。有没有办法在没有模板的帮助下完成这项工作?我知道我在这里很挑剔,因为没有性能损失,而且在我需要这样做的情况下导入模块并不难。我只是想知道它是否是内置的,我忽略了一些东西。

最佳答案

D 中几乎所有重载的运算符都是定义的模板。请注意 void opOpAssign(string op)(Vector vector)有一个模板参数,它是一个字符串。所以,不,你不能将它作为非模板函数重载。现在,您不需要第二个模板来执行此操作(因此,如果询问是否需要模板,您的意思是辅助模板,那么答案是否定的),但是重载的运算符函数已经是模板。

执行您在此处尝试执行的操作的规范方法是使用字符串混合:

void opOpAssign(string op)(Vector vector)
{
mixin("X" ~ op ~ "=vector.X;");
mixin("Y" ~ op ~ "=vector.Y;");
}

关于operator-overloading - D 中优雅的运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7826891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com