传递成员函数作为回调
C++ Passing a member function as a callback
我正在尝试创建一个非常简单的事件系统,在游戏中使用。我有一个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接口的每个类实现。
我真的希望能够传递回调到第二个AddListener函数。然后,这个回调会像以前一样在TriggerEvent函数中被调用。我可以传入一个用std::bind构造的回调函数,这样就可以了。例如:
eventManager->AddListener("WindowResize", std::bind(&MyClass::MemberFunction, this, std::placeholders::_1));
其中MyClass扩展了IEventListener接口。然而,我真的希望能够传递一个简单的函数指针:
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
的实例与对成员函数的引用关联起来。如果没有这些信息,成员函数将无法访问实例的数据。
相关文章:
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- 从不同的 cpp 调用回调函数会导致bad_function_call
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- C 回调函数在对象 pascal 上崩溃
- 类 Referention 中C++回调函数引用非静态函数
- CURLOPT_INTERLEAVEFUNCTION回调函数始终接收 nullptr 作为用户数据指针
- 动态链接库中C++回调函数
- 我想制作设置鼠标回调函数,以便在仍然按下鼠标左键时连续传递坐标
- 使用回调函数从构造函数调用虚拟/派生方法的替代方法?
- 我可以使用谷歌 v8 在回调函数中获取 JavaScript 函数C++源文本吗?
- 重写另一个方法 [C++] 使用的超类回调函数
- 是否可以影响 C++ 中回调函数的局部变量?
- C++ Qt5 中带有 pigpio 库的回调函数
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- C++在赋值或回调函数时重载模板
- 如何用不同的参数类型和数字回调函数
- 如何为Python Swigged C++对象创建和分配回调函数
- 用回调函数替换C++正则表达式
- C++带有回调函数的模板类