D中类的比较运算符重载?

时间:2018-08-15 00:04:33

标签: oop operator-overloading d

我目前正在学习D,并且正在努力了解操作符重载如何在类中起作用?覆盖opCmp是有意义的,并且对于结构正确工作,但是对于类,它需要将右侧作为Object而不是我的类型。

这意味着我无法访问任何成员进行比较。那么过载有什么意义呢?我想念什么吗?

1 个答案:

答案 0 :(得分:2)

确保您可以访问您的成员:

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!");
        }
    }
}

opCmp之所以使用Object作为参数的原因是,它是在Object类中引入的,每个D类都从该类派生。引入opCmp可以说是一个明智的选择,但如今已经不多了。但是,由于我们不想破坏将opCmp(以及opEqualstoHashtoString)与类一起使用的所有D代码,因此有点选择。