如何检查枚举值是否有效?

新手上路,请多包涵

我正在从二进制文件中读取 enum 值,并想检查该值是否真的是 enum 值的一部分。我该怎么做?

 #include <iostream>

enum Abc
{
    A = 4,
    B = 8,
    C = 12
};

int main()
{
    int v1 = 4;
    Abc v2 = static_cast< Abc >( v1 );

    switch ( v2 )
    {
        case A:
            std::cout<<"A"<<std::endl;
            break;
        case B:
            std::cout<<"B"<<std::endl;
            break;
        case C:
            std::cout<<"C"<<std::endl;
            break;
        default :
            std::cout<<"no match found"<<std::endl;
    }
}

我必须使用 switch 运算符还是有更好的方法?

编辑

我设置了枚举值,不幸的是我无法修改它们。更糟糕的是,它们不是连续的(它们的值是 0、75、76、80、85、90、95、100 等)

原文由 BЈовић 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

enum 如果值在以下标准规则定义的范围 [A, B] 内,则该值在 C++ 中有效。所以在 — 的情况下, enum X { A = 1, B = 3 } 2 值被认为是一个有效的枚举值。

考虑标准的 7.2/6:

对于 emin 是最小枚举数且 emax 是最大枚举数的枚举,枚举的值是 bmin 到 bmax 范围内的基础类型的值,其中 bmin 和 bmax 分别是最小值的最小值和最大值可以存储 emin 和 emax 的位域。可以定义一个枚举,它的任何枚举器都没有定义其值。

C++ 中没有追溯。采取的一种方法是在数组中另外列出枚举值,并编写一个包装器来进行转换,并可能在失败时抛出异常。

有关更多详细信息,请参阅有关如何将 int 转换为枚举的 类似问题

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

可能的方法列表。

  • 如果枚举值是自动分配的,请检查枚举是否小于枚举数。
   enum class Enum {
      A, B, C,
  };
  constexpr size_t num_enums = 3;

  bool is_valid(Enum e)
  {
      using enum_t = std::underlying_type_t<Enum>;
      auto val = static_cast<enum_t>(e);
      return (val >= 0) && (val < num_enums);
  }

  • 将枚举值复制到一个集合中,并检查该集合是否包含给定的枚举值。

在这篇文章中有很多这样的答案。

如果您是创建枚举的人,请确保首先需要枚举来解决问题。

  • 使用特定于平台的解决方案。

或者更好的是,使用处理平台特定实现的 3rd 方库。

我建议使用 magic_enum 库。

   bool is_valid(Enum e)
  {
      return magic_enum::enum_contains(e);
  }

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

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