c++ - C++ 避免向下转换
问题描述
我正在使用 C++14 在嵌入式平台上进行开发,并且我正在尝试设计一个用于任务到任务通信的事件总线。我已经按层次结构进行结构化,超类是 Event * 类型,而我的子类是按钮事件、日志记录、通信等类。现在因为我在这么小的嵌入式平台(STM32)上工作,我只想在事件总线中存储一个 Event * 类型的数组列表,当一个任务提交一个事件供另一个任务使用时,我需要做的就是将 Event * 转换为适当的类型以供使用。但是,我想避免使用大量 case 语句来确定将 Event * 转换为哪种类型的情况,因为当我向系统添加更多用户事件时,这将是另一回事。
C++14 提供了哪些特性(如果有)来避免这种情况。我目前正在阅读 typeid() 运算符。我也禁用了 RTTI。
谢谢
解决方案
这是我对您的问题的简单解决方案:
#include <iostream>
#include <string>
enum class EventType {
A,
B,
};
struct Event {
EventType type_;
};
class AEvent : public Event {
public:
AEvent(const std::string description)
: Event{EventType::A}
, description_{description} {
}
std::string get_description() const {
return description_;
}
private:
std::string description_;
};
class BEvent : public Event {
public:
BEvent(const std::string description)
: Event{EventType::B}
, description_{description} {
}
std::string get_description() const {
return description_;
}
private:
std::string description_;
};
void handling_event(Event * event) {
switch (event->type_) {
case EventType::A: {
AEvent * aEvent = static_cast<AEvent *>(event);
}
break;
case EventType::B: {
BEvent * bEvent = static_cast<BEvent *>(event);
}
break;
}
}
int main() {
AEvent a{"Some stange event"};
handling_event(&a);
return 0;
}
这是最简单的解决方案,没有RTTI和其他可以提供帮助的间接方法
我希望它有所帮助;)
推荐阅读
- ruby - TypeError: can't convert Module1::MyClass into Integer,我在这里找不到错误
- visual-studio-code - 有没有办法在不捕获下划线的情况下使用 cursorWordPart*Select 命令?
- java - 设置基于分辨率的长度的最佳时间是什么时候?
- c# - 正则表达式 - 匹配由引号定义并用逗号分隔的字符串
- c++ - 为 std::regex_match 使用自定义分配器
- protocol-buffers - 用于 RPC 调用的 gRPC/protobuf 设计模式涉及固定和大型重复字段的混合?
- r - 如何从字符向量中的不同文本中删除相同的文本块?
- html - 使用 FormArray 而不是 FormControl Angular
- python-3.x - 是否可以在 python3 中进行替代继承?
- python - 使用 Pandas AWS Glue Python Shell 作业