std :: set中的函数和方法指针

Bil*_*ias 5 c++ comparison stl function-pointers set

我的另一个消息中所述,不可能将2个指向成员函数的指针与"<"(小于)进行比较.或者至少,这会导致未定义的行为.

我刚刚设法使用Visual C++和GCC编译此代码:

template <class Receiver, class Param = void*, class Return = void>
class EventReceiver : public IFunction<> {

protected:

    std::set< Return(Receiver::*)(Param) > test;
    std::set< Return(*)(Param) > test2;
...
Run Code Online (Sandbox Code Playgroud)

AFAIK,要创建任何东西的std :: map或std ::,必须可以将集合的值与"<"进行比较.这是否意味着上述容器或实际编译器具有以这种方式比较指针到方法的工作实现?

Bil*_*ias 1

嗯,示例代码的编译实际上具有误导性。事实是这些套装无法使用。每次尝试向其中插入数据都会产生预期的错误。

\n\n

这就是 C++ 模板函数的“阴暗面”。在您使用它们之前它们并不存在(因此在您使用它们之前不会产生编译器错误)。

\n\n

看一下这个 :

\n\n
#include <set>\n\nclass X {};\n\nint main() {\n\n    typedef void(X::*FuncPtr)();\n    std::set< FuncPtr > set;\n    std::less< FuncPtr > less;\n    FuncPtr f1;\n    FuncPtr f2;\n    //set.insert(f1);   // both of these lines\n    //less(f1,f2);      // produce an error\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

删除最后两行中任何一行的注释都会产生错误:

\n\n
\n

\xe2\x80\x98void (X::* const)()\xe2\x80\x99 和 \xe2\x80\x98void (X::*\n const)()\xe2\x80\x99 类型的无效操作数二进制 \xe2\x80\x98 运算符 <\xe2\x80\x99

\n
\n\n

在这里自己在线编译

\n