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 那么这可能很容易。但是在不了解你的代码的情况下,我们无法给出具体的例子。