c++ - 成员函数可以通过哪些方式相互比较?

标签 c++ function operator-overloading compare

我想知道我是否可以将 2 个成员函数与“<”运算符进行比较。我可以做“==”,但我不能在下面的情况下使用它。我尝试将它们转换为 void*,但这也不起作用。

template <class Receiver, class Sender>
class CallBack2 : public ICallBack2 {

protected:

    Receiver* receiver;
    void(Receiver::*function)(Sender*);
    Sender* sender;

public:

    CallBack2(Receiver* _receiver, void(Receiver::*_function)(Sender*), Sender* _sender) : receiver(_receiver), function(_function), sender(_sender) {};
    virtual ~CallBack2() {};

    virtual void callBack() {
        (receiver->*function)(sender);
    }

    virtual bool operator<(const ICallBack2* _other) const {
        CallBack2<Receiver, Sender>* other = (CallBack2<Receiver, Sender>*)_other;
        if (receiver < other->receiver) {
            return true;
        } else if (receiver == other->receiver && function < other->function) {
            return true; // this line gives the error
        }
        return false;
    }
};

有什么想法吗?

最佳答案

C++03 § 5.9 ,它涵盖了内置 <、>、<= 和 >= 的语义,没有提到指向成员和状态的指针:

Other pointer comparisons are unspecified.

根据 § 8.3.3 , 3

The type "pointer to member" is distinct from the type "pointer",

因此,我们可以得出结论,将关系运算符应用于指向成员(无论是函数还是字段)的指针的结果是未指定的。

请注意,“未指定行为”不同于“未定义行为”,但仍然意味着您无法有效地应用运算符,因为不同的实现可能会产生不同的结果。 “未指定”基本上意味着实现可以定义行为。

关于c++ - 成员函数可以通过哪些方式相互比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6662917/

相关文章:

javascript - Click() jQuery 函数不适用于简单的 div

c# - c# 中的字符串相等运算符 ==

c++ - 作为变量的 Symbol 的值是 void :company-c-headers

c++ - 客户端和服务器示例不工作

function - 有没有办法在 Dart 中与两种类型进行争论?

javascript - 为什么我的按钮使我的函数在不同的窗口中打开?

C++ << 运算符重载

c++ - 私有(private)内部成员的运算符重载

c++ - 无法对匿名对象使用运算符<<

c++ - 在 directx 11 中渲染地形