C ++:从成员函数指针获取地址

时间:2015-03-10 19:53:44

标签: c++ pointers function-pointers member-function-pointers

我需要编写一个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);

但这只是给了我与以前完全相同的错误信息。谁能告诉我如何比较这两个成员函数指针?

0 个答案:

没有答案