C++ 将成员函数作为回调传递

标签 c++ function-pointers pointer-to-member

我正在尝试创建一个非常简单的事件系统以在游戏中使用。我有一个看起来像这样的 EventManager 类:

typedef std::function<void(IEvent* event)> CallbackType;

class EventManager
{
public:
    void AddListener(const std::string eventName, IEventListener* listener)
    {
        CallbackType callback = std::bind(&IEventListener::HandleEvent, listener, std::placeholders::_1);

        listeners[eventName].push_back(callback);
    }

    void AddListener(const std::string eventName, CallbackType callback)
    {
        // ...
    }

    void TriggerEvent(IEvent* event)
    {
        for (CallbackType callback : listeners[event->GetName()])
        {
            callback(event);
        }
    }
private:
    std::map<std::string, std::vector<CallbackType>> listeners;
}

第一个 AddListener 函数运行良好。 TriggerEvent 函数调用 HandleEvent 函数,该函数由扩展我的 IEventListener 接口(interface)的每个类实现。

我真的很想能够将回调传递给第二个 AddListener 函数。然后,将像以前一样在 TriggerEvent 函数中调用此回调。我可以传入一个使用 std::bind 构造的回调,这很有效。例如:

eventManager->AddListener("WindowResize", std::bind(&MyClass::MemberFunction, this, std::placeholders::_1));

其中 MyClass 扩展了 IEventListener 接口(interface)。但是,我真的很希望能够传递一个简单的函数指针:

eventManager->AddListener("WindowResize", this, &MyClass::MemberFunction);

这可能吗?

编辑

对于任何感兴趣的人,我写了几个宏,我认为它们可以使事情变得更清晰。

#define MEMBER_CALLBACK(funPtr) \
std::bind(&funPtr, this, std::placeholders::_1)

#define MEMBER_CALLBACK_WITH_INSTANCE(funPtr, instancePtr) \
std::bind(&funPtr, instancePtr, std::placeholders::_1)

现在我可以通过以下方式订阅事件:

eventManager->AddListener("EventName", MEMBER_CALLBACK(MyClass::MemberFunction));

最佳答案

您不能传递简单函数指针,因为 MyClass::MemberFunction 不是简单函数。 std::bind() 起作用是因为它将 MyClass 的实例与对成员函数的引用相关联。如果没有该信息,成员函数将无法访问实例的数据。

关于C++ 将成员函数作为回调传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17058540/

相关文章:

c++ - 如何使用 Clion 调试外部可执行文件

c++ - g++中的模板函数匹配

c# - 泛型 C# 的重载运算符

c++ - 传递对象成员函数作为参数(函数指针)

c++ - 使用可变参数模板(gcc、clang)的成员函数指针包装器

c++ - 为什么自由函数指针总是指针类型,而成员函数指针实际上不是指针?

c++ - 计算循环中的数字总和

c++ - 我可以像这样使用 mem_fun 吗?

c++ - 如何在 C 中定义函数指针数组

c++ - 为什么可以通过类类型获取成员函数的地址