将枚举与整数进行比较

新手上路,请多包涵

我读过你不应该相信枚举的底层实现是签名还是未签名。由此我得出结论,您应该始终将枚举值转换为与之比较的类型。像这样:

 enum MyEnum { MY_ENUM_VALUE = 0 };

int i = 1;
if (i > static_cast<int>(MY_ENUM_VALUE))
{
    // do stuff
}

unsigned int u = 2;
if (u > static_cast<unsigned int>(MY_ENUM_VALUE))
{
    // do more stuff
}

这是最佳做法吗?

编辑:如果枚举是匿名的,情况会改变吗?

原文由 khuttun 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.9k
1 个回答

一个 enum 是一个整数,因此您可以将它与任何其他整数进行比较,甚至是浮点数。在比较之前,编译器会自动将两个整数转换为最大值,或者将枚举转换为双精度数。

现在,如果您的枚举本身不应该代表一个数字,您可能需要考虑创建一个类:

 enum class some_name { MY_ENUM_VALUE, ... };

int i;
if(i == static_cast<int>(some_name::MY_ENUM_VALUE))
{
    ...
}

在这种情况下,您需要进行强制转换,因为默认情况下枚举类不被视为整数。这有助于避免错误,以防您误用枚举值…


更新: 另外,您现在可以指定 enum 的整数类型。这在较旧的编译器中也可用,但它通常不能正常工作(根据我自己的经验)。

 enum class some_name : uint8_t { ... };

这意味着枚举使用 uint8_t 来存储这些值。如果您在用于通过网络发送数据或保存在需要知道数据确切大小的二进制文件中的结构中使用枚举值,则非常实用。

未指定时,类型默认为 int


正如其他人提出的,如果使用 enum 只是 为了声明数字,那么使用 constexpr 可能会更好。

 constexpr int MY_CONSTANT_VALUE = 0;

这具有相同的效果,只有 MY_CONSTANT_VALUE 的类型现在是 int 。您可以更进一步并使用 typedef ,如下所示:

 typedef int my_type_t;
constexpr my_type_t MY_CONSTANT_VALUE = 0;

我经常使用 enum 即使我要使用单个值,而该值通常不被视为整数。在这种情况下,没有一成不变的规则。

原文由 Alexis Wilke 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏