【发布时间】:2021-06-11 07:06:43
【问题描述】:
我正在设计一个简单的 Pub/Sub 系统(基于 Boost Signals2)。在此系统中,您可以通过EventManager::subscribe 订阅特定类型的事件。然而,令人沮丧的是,每个订阅者都必须将const Event& 投射到他们订阅的特定事件中。避免这个问题的好/优雅的方法是什么?我很高兴改用完全不同的设计。
#include <iostream>
#include <functional>
#include <string>
class Event {
virtual std::string get_type() = 0;
};
class EventA : public Event {
std::string get_type() override {
return "EVENT_A";
}
int get_foo() {
return 5;
}
};
class EventManager {
public:
void publish_event(const Event &e);
void subscribe(std::string type, std::function<void(const Event &)> subscriber);
};
int main() {
EventManager event_manager;
event_manager.subscribe("EVENT_A", [&](const Event &e) {
const EventA &event_a = static_cast<const EventA &>(e); // how can avoid cast here?
// do stuff with event_a
});
EventA event_a;
event_manager.publish_event(event_a);
}
【问题讨论】:
-
从您描述的有限信息来看,很难判断。如果您的“订阅者”功能仅使用
Event提供的功能,则不需要静态转换,例如Event提供函数get_foo()并且(如果是virtual)EventA覆盖它。如果您希望EventA具有Event不知道的功能 - 并且让您的“订阅者”直接调用它们 - 那么您需要static_cast。根据您的需要,您可能需要查找将对象与算法分开的技术 - 例如访问者设计模式或“双重调度”技术。
标签: c++ c++11 events event-handling publish-subscribe