gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:19:09 25 4
gpt4 key购买 nike

C++11 作用域枚举很棒,您应该尽可能使用它们。但是,有时您需要将整数转换为作用域枚举值(假设您是从用户输入中获取它)。

是否有一种安全的方法来执行此操作并检测值何时无效(即超出枚举的允许值)?

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

最佳答案

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

enum class Colors : char
{
Red,
Green,
Blue,
Last_Element
}

使用这种方法,在转换时,您可以检查您使用的值是否小于 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;
}

你可以像这样使用它:

if(IsValidEnumIntegral<Colors>(2))
//do whatever

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

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

编辑:这仅在所讨论的枚举使用一组元素没有间隙的整数时才有效。提供的函数还将假定枚举不包含负整数,但可以轻松地向其添加 First_Element。

关于c++ - 如何安全地将整数类型转换为作用域枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37752002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com