D 中 class 的比较运算符重载?
Comparison operator overloading for class in D?
我目前正在学习 D 并努力理解运算符重载如何适用于 class?重写 opCmp 对结构来说是有意义的并且可以正常工作,但是对于 class 它需要将右侧作为对象而不是我的类型。
这意味着我无法访问任何成员来进行比较。那么超载有什么意义呢?我错过了什么吗?
确定您可以访问您的会员:
class MyClass {
int member;
override int opCmp(Object other) {
if (auto mcOther = cast(MyClass)other) {
// other, and thus mcOther, is an instance of MyClass.
// So we can access its members normally:
return member < mcOther.member ? -1
: member > mcOther.member ? 1
: 0;
} else {
// other is not a MyClass, so we give up:
assert(0, "Can't compare MyClass with just anything!");
}
}
}
classes 的 opCmp
将 Object
作为参数的原因是它被引入 Object
class,每个 D class 推导。引入 opCmp
在过去是一个明智的选择,但现在就不那么明智了。但是,由于我们不想破坏使用 opCmp
(以及 opEquals
、toHash
和 toString
)和 class 的每一段 D 代码是的,我们有点坚持这个选择。
我目前正在学习 D 并努力理解运算符重载如何适用于 class?重写 opCmp 对结构来说是有意义的并且可以正常工作,但是对于 class 它需要将右侧作为对象而不是我的类型。
这意味着我无法访问任何成员来进行比较。那么超载有什么意义呢?我错过了什么吗?
确定您可以访问您的会员:
class MyClass {
int member;
override int opCmp(Object other) {
if (auto mcOther = cast(MyClass)other) {
// other, and thus mcOther, is an instance of MyClass.
// So we can access its members normally:
return member < mcOther.member ? -1
: member > mcOther.member ? 1
: 0;
} else {
// other is not a MyClass, so we give up:
assert(0, "Can't compare MyClass with just anything!");
}
}
}
classes 的 opCmp
将 Object
作为参数的原因是它被引入 Object
class,每个 D class 推导。引入 opCmp
在过去是一个明智的选择,但现在就不那么明智了。但是,由于我们不想破坏使用 opCmp
(以及 opEquals
、toHash
和 toString
)和 class 的每一段 D 代码是的,我们有点坚持这个选择。