【发布时间】:2021-09-22 08:18:14
【问题描述】:
我有一个枚举类,例如:
enum class State{
S1,
S2,
S3,
S4
};
每当我做出可能使用此类的 switch/case 语句时,我都想不惜一切代价避免使用“默认”,以强制我为所有可能的情况编写语句。这个想法是,如果我在这个枚举中添加一个新案例“S5”,由于缺少默认值,编译器会在每次切换时向我发送警告,因为并非所有案例都被覆盖。通过这样做,我最终不会忘记这个新状态可能需要实现特定行为的地方。
问题是,有各种开关/案例,其中只有一些枚举案例的实现:
switch(state)
{
case S1:
doSomething1();
break;
case S2:
doSomething2();
break;
case S3:
break;
case S4:
break;
}
但是对于没有行为的状态,我不太喜欢这些各种“空”的情况,然后休息。这正是“默认”更优雅的地方,但正如我刚刚解释的那样,这就是我想要避免的。
有没有更优雅(或更高效?)的方式来实现我在这里尝试做的事情?因为我知道其他编程语言为 switch/case 语句提供了更高级的语法,但我不确定 C++(更具体地说是 C++17)的可能性。
【问题讨论】:
-
breakofS3是不需要的。 -
case子句 "fall-through" 这样您就可以将所有未使用的案例与单个break组合在一起(以及向您未来的自己解释这一点的评论)。 -
顺便说一句,对于值和(未参数化的)动作之间的简单 1:1 关系,如这里,您可以使用由枚举值索引的函子/函数指针数组,或者如果枚举是映射不连续且基于 0。诚然,我看不出这将如何解决您的完整性问题。
-
在某些特殊情况下可以使用 if 语句代替 switch。
-
很遗憾编译器是对的,因为您没有涵盖所有情况;不幸的是,
default是必需的,并且不应为空(相反,它应该引发断言失败)。原因是您的枚举变量可以包含与您声明的值不同的值。
标签: c++ enums switch-statement c++17