我需要编写一个operator ==函数,需要比较两个成员函数指针并检查它们是否指向同一个函数。我最初试图这样做:
typedef void(EventListenerClass::*EventHandler)(const Event&);
struct EventListener
{
EventListenerClass *_listener = NULL;
EventHandler _handler = NULL;
inline bool operator== (const EventListener& other) const
{ return addressof(_listener->*_handler) == addressof(other._listener->*_handler); };
};
但这给了我以下信息:
错误:指向绑定函数的指针只能用于调用函数
我找到了一个潜在的解决方案here,我将在下面引用:
在C ++中,指向成员函数(PMF)的指针是使用a实现的 各种各样的宽指针来处理所有可能的调用机制;该 PMF需要存储有关如何调整'this'指针的信息, 如果指向的函数是虚拟的,在哪里可以找到vtable, 以及在vtable中寻找成员函数的位置。如果你是 在内循环中使用PMF,你应该重新考虑它 决策。如果这不是一个选项,您可以提取指向 将为给定的对象/ PMF对调用并调用它的函数 直接在内循环内部,以节省一点时间。
此扩展程序的语法是
extern A a; extern int (A::*fp)(); typedef int (*fptr)(A *); fptr p = (fptr)(a.*fp);
我尝试将此解决方案调整到我的代码中,如下所示:
extern EventListenerClass a;
extern int (EventListenerClass::*fp)();
typedef int(*fptr)(EventListenerClass *);
fptr p = (fptr)(a.*fp);
但这只是给了我与以前完全相同的错误信息。谁能告诉我如何比较这两个成员函数指针?