如何安全地将整数类型转换为作用域枚举

tot*_*oth 5 c++ c++11

C++11范围内的枚举很棒,你应该尽可能使用它们.但是,有时您需要将整数转换为作用域枚举值(例如,如果您是从用户输入获取它).

有没有一种安全的方法来执行此操作并检测值何时无效(即,在枚举的允许值之外)?

我相信如果整数无效,只使用static_cast会导致未定义的行为.是否存在一种通用的方法,不需要手动为每个作用域枚举类型编写转换函数(每次向枚举添加新值时都需要更新)?

Alt*_*nia 5

一种常见的方法是在枚举中包含结束标记

enum class Colors : char
{
  Red,
  Green,
  Blue,
  Last_Element
}
Run Code Online (Sandbox Code Playgroud)

使用这种方法,在转换时,您可以检查您使用的值是否小于 Last_Element 的值。

考虑以下函数:

template<typename T>
typename std::enable_if<std::is_enum<T>::value, bool>::type
  IsValidEnumIntegral<T>(int integral)
{
  return (int)(T::Last_Element) > integral;
}
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用它:

if(IsValidEnumIntegral<Colors>(2))
  //do whatever
Run Code Online (Sandbox Code Playgroud)

这适用于您使用名为 Last_Element 的元素创建的任何枚举。您可以进一步创建类似的功能,然后为您自动转换。

注意:这未经测试。我目前无法这样做,但我认为这可行。

编辑:只有当相关枚举使用一组元素没有间隙的整数时,这才有效。提供的函数还将假设枚举不包含负整数,尽管可以轻松地将 First_Element 添加到其中。