存储固定长度的命名常量集合的最佳数据结构是什么,这些常量可以在没有显式转换的情况下用于开关?
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
个案例、if
等 上有一组人类可读的标签
- 标签应该尽可能简洁可用,以保持代码整洁。 IE。无需显式强制转换或调用成员函数来提取内容。
将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:
...
存储固定长度的命名常量集合的最佳数据结构是什么,这些常量可以在开关中使用而无需显式转换?
我想编写如下所示的干净代码:
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)) {…}
您可以为 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:
...