存储固定长度的命名常量集合的最佳数据结构是什么,这些常量可以在交换机中使用而不需要显式强制转换?
我想写这样干净的代码:
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
、if
等案例上有一组人类可读的标签。 标签应该是可用的,尽可能少的冗长,以保持代码的干净。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); }