我建议在switch 中使用“失败”案例:
enum State
{
StateAA,
StateAB,
StateAC,
StateBA,
StateBB,
StateBC,
StateCA,
StateCB
};
void DisplayState(State st)
{
switch( st )
{
case StateAA :
case StateAB :
case StateAC :
{
displayColor = red;
}
break ;
case StateBA :
case StateBB :
case StateBC :
{
displayColor = yellow;
}
break ;
case StateCA :
case StateCB :
default :
{
displayColor = green;
}
break ;
}
}
这样,每个案例的枚举不必是连续的或在特定范围内。
如果您选择不这样做,至少在条件中使用enum 常量而不是“幻数”:
if(st < StateBA)
displayColor = red;
else if(st < StateCA)
displayColor = yellow;
else
displayColor = green;
或者更好的是,在枚举中定义组:
enum State
{
StateAA,
StateAB,
StateAC,
StateB_GroupStart,
StateBA = StateB_GroupStart,
StateBB,
StateBC,
StateC_GroupStart,
StateCA = StateC_GroupStart,
StateCB
};
然后:
if(st < StateB_GroupStart)
displayColor = red;
else if(st < StateC_GroupStart)
displayColor = yellow;
else
displayColor = green;
我不能真正推荐这最后两个选项中的任何一个 - 它们只是比您的原始解决方案更不“hacky”。它们仍然依赖于 enum 常量的特定顺序,如果您不知道它很关键,这可能很容易在维护中搞砸——它至少需要一个注释来阻止粗心的维护者破坏它。您可以通过定义组结束广告测试 st 介于开始和结束之间来在一定程度上缓解这种情况,但这只是说明了解决方案的麻烦程度。我还需要一个通常效率较低的if/else if/else 链。
通过避免在enum 值中产生“间隙”,以便每个连续值是连续的,这意味着可以轻松地将开关优化为跳转表。如果您在条件测试中使用enum 常量,那么这些间隙在任何情况下都是不必要的。