我应该如何检查基础类型值是否为枚举值?

ein*_*ica 10 c++ enums

让我们I成为一个整体类型.现在假设我有一个enum class my_enum_class : I,可能不连续的值.现在我得到了一些I价值.如何检查它是否是枚举的值my_enum_class

类似问题的答案(对于C语言)假设值是连续的,并且可以添加"虚拟"上限值,并检查0和该值之间的范围; 这与我的情况无关.还有另一种方法吗?

Yak*_*ont 8

目前无法做到这一点.

有一些反思建议可以使它成为和/或,它允许你对枚举中的枚举值进行迭代(在编译时运行时间).使用它,检查将相对容易.

有时人们通常使用宏进行手动枚举反射.

  • 反思最快也要23岁。 (2认同)

Lig*_*ica 7

没有内置的方法来做到这一点.所有Is都是"有效"值my_enum_class,因此您无法对基础类型执行任何操作.至于针对I枚举器列表验证s,没有反射就没有办法做到这一点.

根据上下文,我倾向于构建一个静态std::unordered_set(并对其进行查找),或者有一个函数列出所有我的枚举器switch(并返回falseiff输入不匹配它们),或者只是不打扰,而是记录某处将未列举的my_enum_class值传递给我的函数应被视为狡猾的欺骗并且具有未指定的行为.

最终,这一切都源于这样一个事实:枚举应该在更广泛的完全有效状态中列出"常用的方便命名的值",而不是仅包含完全约束的常量集的类型.我们几乎都滥用枚举.