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 的 opCmpObject 作为参数的原因是它被引入 Object class,每个 D class 推导。引入 opCmp 在过去是一个明智的选择,但现在就不那么明智了。但是,由于我们不想破坏使用 opCmp(以及 opEqualstoHashtoString)和 class 的每一段 D 代码是的,我们有点坚持这个选择。