C++ Passing a member function as a callback
我正在尝试创建一个用于游戏的非常简单的事件系统。我有一个看起来像这样的 EventManager 类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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 接口的每个类实现。
我真的希望能够将回调传递给第二个 AddListener 函数。然后,该回调将像以前一样在 TriggerEvent 函数中被调用。我可以传入一个使用 std::bind 构造的回调,这很有效。例如:
1 | eventManager->AddListener("WindowResize", std::bind(&MyClass::MemberFunction, this, std::placeholders::_1)); |
其中 MyClass 扩展了 IEventListener 接口。但是,我真的希望能够只传递一个简单的函数指针:
1 | eventManager->AddListener("WindowResize", this, &MyClass::MemberFunction); |
这可能吗?
编辑
对于任何感兴趣的人,我写了几个宏,我认为它们可以让事情变得更简洁。
1 2 3 4 5 | #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) |
现在我可以通过以下方式订阅事件:
1 | eventManager->AddListener("EventName", MEMBER_CALLBACK(MyClass::MemberFunction)); |
你不能传递一个简单的函数指针,因为