存储可在开关中使用而无需显式转换的固定长度命名常量集合的最佳数据结构是什么?
我想编写如下所示的干净代码:
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/