通常,在编写简单的状态机时,您的总订单如下:

State {
  initial,
  connecting,
  established,
  ready,
  closed,
  failed
}

您可以轻松测试给定值的等效性:
if (state == State::established)

但是,如果您的状态已准备就绪,即使准备就绪意味着已建立,该测试也会失败?替代方法是添加另一个子句,但列表较长,或者更改要求可能会更长。
if (state == State::established || state == State::ready || ...)

使用C样式的枚举,甚至可以通过转换为整数来确定相对顺序:
if (state > State::established && state <= State::closed)

但是,如果您想享受类型安全枚举类(除了增加了operator

最佳答案

如您所知,作用域枚举提供类型安全性,因为它们不能隐式转换为整数。

但是没有什么可以阻止您将枚举转换为整数:

if ((int)state > (int)State::established && (int)state <= (int)State::closed)

您可以使用static_cast的C样式强制转换。

10-07 19:09
查看更多