c++ - 多个类的通用调度程序
问题描述
我试图在 C++ 中达到同样的效果。在 Python 中,只需将类方法指针传递给调度程序并在特定事件发生时执行函数回调非常简单。我正在寻找的效果是一个真正的通用调度类方法。此外,这些类不应以任何方式相关(如下例所示)。
class Dispatcher:
def __init__(self):
self.map = {}
def register(self, func, event):
try:
self.map[event].append(func)
except KeyError:
self.map[event] = [func]
def dispatch(self, event):
for func in self.map[event]:
func(event)
class A:
def __init__(self):
pass
def foo(self, event):
print("A", event)
class B:
def __init__(self):
pass
def bar(self, event):
print("B", event)
if __name__ == '__main__':
d = Dispatcher()
a = A()
b = B()
d.register(a.foo, 6)
d.register(b.bar, 6)
d.register(a.foo, 7)
d.dispatch(6)
预期输出:
A 6
B 6
解决方案
#include <map>
#include <vector>
#include <functional>
using namespace std;
class dispatcher
{
public:
using event_t = int;
using callback_t = function<void(event_t)>;
void register(callback_t c, event_t e)
{
m[e].emplace_back(move(c));
}
void dispatch(event_t e)
{
for(auto&&c: m[e])
c(e);
}
private:
map<event_t, vector<callback_t>> m;
};
你可以做这样的事情。我在手机上一口气写了这个,所以我不知道它是否有效。
也就是说,这与您无法传递自动捕获对象 thisptr 的函数的方式并不完全相同。您将按如下方式使用它,并带有一个仿函数:
A a;
d.register([&](int i){a.foo(i);}, 6);
推荐阅读
- ssis - SSIS 事件处理程序脚本任务
- android - 如何计算 daterangepicker materialdesign 中选择的天数?
- kotlin - 作为一名 java 开发人员,我如何在 kotlin 中编写这个函数,但切换到 kotlin
- typescript - 摩纳哥编辑器 SignatureHelpProvider 实现
- javascript - Javascript .replaceAll() 不是函数类型错误
- c++ - Qt Signal/Slots:传递函数返回指针作为接收器参数:可能吗?
- c - 试图访问内存映射圆缓冲区的总线错误
- xcode - 有人可以给我一个带有 Xcode 项目的 Mac 的 Chromiums 源代码的 ZIP 文件吗
- javascript - TypeScript - 将哈希表作为参数传递给 PowerShell 脚本
- html - 在两个 div 中对齐文本的顶部