存储固定长度的命名常量集合的最佳数据结构是什么,这些常量可以在没有显式转换的情况下用于开关?

What is the best data structure for storing a fixed length collection of named constants that can be used in a switch without explicit casting?

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

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

   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 而无需在每个 case 中显式地将值转换为 int非常冗长的声明,违背了使用干净、易于阅读的标签的意义。

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

条件:

switch条件转换为枚举类型:

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

您可以为 enum class:

定义移位和按位运算符
inline EventType operator&(EventType a, std::uint8_t b)
    { return EventType(std::uint8_t(a) & b); }

inline EventType operator>>(EventType a, std::uint8_t s)
    { return EventType(std::uint8_t(a) >> s); }

为状态的事件部分定义一个访问器(对其他部分也这样做):

EventType event(int status) 
{ 
    return static_cast<EventType>((status & 0xF0) >> 4); 
}

然后

switch(event(Status)){
     case EventType::NOTE_OFF:
     ...