c++ - 用于存储可在 switch 中使用而无需显式转换的固定长度命名常量集合的最佳数据结构是什么?

标签 c++ containers

存储可在开关中使用而无需显式转换的固定长度命名常量集合的最佳数据结构是什么?

我想编写如下所示的干净代码:

   enum class EventType : uint8_t{
      NOTE_ON = 9,
      NOTE_OFF = 8,
      CONTROL_CHANGE = 11,
      CHANNEL_PRESSURE = 13,
      PITCH_WHEEL_CHANGE = 14
   };

   // Sometime later in a function scope:
   using enum EventType;
   switch(((Status & 0xF0)>>4)){
         case NOTE_OFF:
            std::cout << "NOTE OFF: " << std::endl;
         break;
         case NOTE_ON:
            std::cout << "NOTE ON: " std::endl;
         break;
         case CONTROL_CHANGE:
            std::cout << "CONTROL CHANGE: " <<std::endl;           
         break;
         case CHANNEL_PRESSURE: 
            std::cout << "CHANNEL PRESSURE: " <<std::endl;
         break;
         case PITCH_WHEEL_CHANGE:
            std::cout << "PITCH WHEEL CHANGE: " << std::endl;
         break;
         default:
            std::cout << "UNKNOWN EVENT TYPE: " << <<std::endl;
   }

但是似乎没有办法在 switch 中使用 enum class 而不将值显式转换为 int在每一个 case 语句中,这都非常冗长,并且违背了使用干净、易于阅读的标签的意义。

是否有更好的数据容器选择?

标准:

  • 容器中项目的数量和长度是固定的并且在编译时已知。
  • 内容在运行时永远不会改变。
  • 文本标签不需要显示或打印。
  • 数据应位于某种类型的集合中,以避免命名空间污染。
  • 目标是在 switch 案例、if 等方面拥有一组人类可读的标签。
  • 标签应尽可能简洁地使用,以保持代码简洁。 IE。无需显式转换它或调用成员函数来提取某些内容。

最佳答案

switch条件转换为枚举类型:

switch(static_cast<EventType>((Status & 0xF0)>>4)) {…}

关于c++ - 用于存储可在 switch 中使用而无需显式转换的固定长度命名常量集合的最佳数据结构是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69008219/

相关文章:

docker - docker stdin 和 tty 标志如何在容器的封面下工作?

c++ - g++ 外部引用错误

c++ - 带别名的可变大小位域

testing - 如何使用 arquillian 进行具有多个 maven 模块的集成测试

image - docker ubuntu 容器文件系统

Azure - 检查新的 blob 是否上传到容器

c++ - 我是否需要定义 `operator==` 才能将我的类与标准容器一起使用?

javascript - ATL ActiveX 控件如何向 javascript 公开一个 bool 值

c++ - 如何对除 T 级以外的所有人隐藏数据

c++ - 编译 C 和 C++