首页 > 解决方案 > C++ 避免向下转换

问题描述

我正在使用 C++14 在嵌入式平台上进行开发,并且我正在尝试设计一个用于任务到任务通信的事件总线。我已经按层次结构进行结构化,超类是 Event * 类型,而我的子类是按钮事件、日志记录、通信等类。现在因为我在这么小的嵌入式平台(STM32)上工作,我只想在事件总线中存储一个 Event * 类型的数组列表,当一个任务提交一个事件供另一个任务使用时,我需要做的就是将 Event * 转换为适当的类型以供使用。但是,我想避免使用大量 case 语句来确定将 Event * 转换为哪种类型的情况,因为当我向系统添加更多用户事件时,这将是另一回事。

C++14 提供了哪些特性(如果有)来避免这种情况。我目前正在阅读 typeid() 运算符。我也禁用了 RTTI。

谢谢

标签: c++embedded

解决方案


这是我对您的问题的简单解决方案:

#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和其他可以提供帮助的间接方法

我希望它有所帮助;)


推荐阅读