C++11范围内的枚举很棒,你应该尽可能使用它们.但是,有时您需要将整数转换为作用域枚举值(例如,如果您是从用户输入获取它).
有没有一种安全的方法来执行此操作并检测值何时无效(即,在枚举的允许值之外)?
我相信如果整数无效,只使用static_cast会导致未定义的行为.是否存在一种通用的方法,不需要手动为每个作用域枚举类型编写转换函数(每次向枚举添加新值时都需要更新)?
一种常见的方法是在枚举中包含结束标记
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 添加到其中。