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



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

我想写这样干净的代码:

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,这是非常冗长的,并且无法使用干净,易于阅读的标签。

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

标准:

  • 容器中项目的数量和长度是固定的,并且在编译时已知。
  • 内容在运行时不会改变。
  • 不需要显示或打印文本标签。
  • 数据应该在某种类型的集合中,以避免命名空间污染。
  • 目标是在switchif等案例上有一组人类可读的标签。
  • 标签应该是可用的,尽可能少的冗长,以保持代码的干净。ie。不需要显式地强制转换它或调用成员函数来提取一些东西。

强制转换条件对于switch的枚举类型:

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

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

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

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

您可以为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); }

相关内容

  • 没有找到相关文章

最新更新