首页 > 解决方案 > 多个类的通用调度程序

问题描述

我试图在 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

标签: c++

解决方案


#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);

推荐阅读