C++触发一个事件一次
C++ fire an event once
我卡在了 C++ 98
我用 C++ 编写了一个基本的事件系统,类似于用脚本语言完成的事情。
Events/callbacks 存储在一个映射中
std::hash_map<uint32_t, std::vector<EVENTHANDLER> >
API 例子
ES es;
es.On("MyEvent", MyCallback);
Event event(1,2,3);
es.Emit("MyEvent", event);
es.Off("MyEvent", MyCallback);
我想实现典型的 One
方法,在执行回调后,它会被删除,这样它只会触发一次。在 JS 中这很容易,你可以将回调包装在一个匿名函数中
one(event, cb){
this.on(event, (e) => {
cb(e);
this.off(event, cb);
});
}
但是我不能在 C++ 98 中使用 lambda。有没有其他简单的方法可以做到这一点?我想也许如果回调注册 "one" 它可以放入一个 "one" 回调的向量中,每次发出事件时都必须迭代,但这是一个备份解决方案。
您的 ES
似乎没有任何理由不能做到这一点。
- 添加调用
es.Once("MyEvent", MyCallback);
的功能
- 让这个和
es.On
在你存储这些东西的任何地方设置一个布尔标志,bool once
- 完成运行任务后,如果
task.once
,就做Off(TheEventImRunning, TheCallbackItUses)
。
这就是您提出的逻辑,但没有使用 lambda。只需在您的函数中正常编写它,并在某处存储一个布尔值来决定是否需要额外的逻辑 运行.
或者,您可以考虑 绑定 MyCallback
到另外执行 Off()
调用的包装器。如果 MyCallback
只是一个函数指针或 std::function
那么这可能很容易。但是在不了解你的代码的情况下,我们无法给出具体的例子。
我卡在了 C++ 98
我用 C++ 编写了一个基本的事件系统,类似于用脚本语言完成的事情。
Events/callbacks 存储在一个映射中
std::hash_map<uint32_t, std::vector<EVENTHANDLER> >
API 例子
ES es;
es.On("MyEvent", MyCallback);
Event event(1,2,3);
es.Emit("MyEvent", event);
es.Off("MyEvent", MyCallback);
我想实现典型的 One
方法,在执行回调后,它会被删除,这样它只会触发一次。在 JS 中这很容易,你可以将回调包装在一个匿名函数中
one(event, cb){
this.on(event, (e) => {
cb(e);
this.off(event, cb);
});
}
但是我不能在 C++ 98 中使用 lambda。有没有其他简单的方法可以做到这一点?我想也许如果回调注册 "one" 它可以放入一个 "one" 回调的向量中,每次发出事件时都必须迭代,但这是一个备份解决方案。
您的 ES
似乎没有任何理由不能做到这一点。
- 添加调用
es.Once("MyEvent", MyCallback);
的功能
- 让这个和
es.On
在你存储这些东西的任何地方设置一个布尔标志,bool once
- 完成运行任务后,如果
task.once
,就做Off(TheEventImRunning, TheCallbackItUses)
。
这就是您提出的逻辑,但没有使用 lambda。只需在您的函数中正常编写它,并在某处存储一个布尔值来决定是否需要额外的逻辑 运行.
或者,您可以考虑 绑定 MyCallback
到另外执行 Off()
调用的包装器。如果 MyCallback
只是一个函数指针或 std::function
那么这可能很容易。但是在不了解你的代码的情况下,我们无法给出具体的例子。