c++ - 如何避免 Pub/Sub 系统中的 static_cast?(C++)
问题描述
我正在设计一个简单的 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);
}
解决方案
是的,这是典型的瓶颈模式,您的多态性不适合您的需求。它使您可以通过同一个孔挤压不同的数据,然后再弄清楚它是什么。因此,您必须为“base”事件订阅某种字符串名称,如下所示:
void subscribe(std::string type, std::function<void(const Event &)> subscriber);
您可能想要的是使用特定类型的处理程序订阅特定事件:
void subscribe(std::function<void(const SquareEvent &)> subscriber);
void subscribe(std::function<void(const RoundEvent &)> subscriber);
或者,也许您甚至希望对此进行通用订阅:
template<class E>
void subscribe(std::function<void(const E &)> subscriber) {
// implement
}
后者必须在标题中实现。如果你这样做,那么你不需要将EventA&
toEvent&
然后在处理程序中Event&
转换回EventA&
.
推荐阅读
- python - 如何制作平方数列表?
- javascript - 如何在 socket.io 服务器中调用节点 api 响应
- c++ - 初始化具有非默认构造函数的 std::array 项的更好方法?
- z3 - 如何简化 Z3 输入格式(如删除和合并操作)并将其转换为普通的布尔表达式?
- python - 如何在 rpy2 中使用 gamlss
- python - 未使用 WTForms 在 Flask 中使用多个表将数据保存到 SQLite DB
- python - 不支持 ssd_inception_v2。有关与不同版本 TensorFlow 兼容的特征提取器,请参阅 `model_builder.py`
- vert.x - 无法使用 VertxUnitRunner 运行测试
- postgresql - 尝试添加数据库时出现 Qt PostgreSQL 链接器错误
- excel - 如何将列值转换为vba宏中的行