c++ - 键入安全枚举位标志

标签 c++ enums bitwise-operators c++03

我希望为我当前的问题使用一组位标志。这些标志(很好地)定义为 enum 的一部分,但是我知道当您 OR 来自枚举的两个值时 OR 的返回类型code> 操作的类型为 int

我目前正在寻找的是一种解决方案,它允许位掩码的用户保持类型安全,因此我为 operator |

创建了以下重载
enum ENUM
{
    ONE     = 0x01,
    TWO     = 0x02,
    THREE   = 0x04,
    FOUR    = 0x08,
    FIVE    = 0x10,
    SIX     = 0x20
};

ENUM operator | ( ENUM lhs, ENUM rhs )
{
    // Cast to int first otherwise we'll just end up recursing
    return static_cast< ENUM >( static_cast< int >( lhs ) | static_cast< int >( rhs ) );
}

void enumTest( ENUM v )
{
}

int main( int argc, char **argv )
{
    // Valid calls to enumTest
    enumTest( ONE | TWO | FIVE );
    enumTest( TWO | THREE | FOUR | FIVE );
    enumTest( ONE | TWO | THREE | FOUR | FIVE | SIX );

    return 0;
}

这种重载真的提供类型安全吗?强制转换包含未在枚举中定义的值的 int 会导致未定义的行为吗?有什么注意事项需要注意吗?

最佳答案

Does this overload really provide type safety?

在这种情况下,是的。枚举值的有效范围至少达到(但不一定包括)在最大命名枚举数之后的下一个最大的 2 次方,以便允许将其用于这样的位掩码。所以对两个值的任何按位运算都会给出一个可以用这种类型表示的值。

Does casting an int containing values not defined in the enum cause undefined behaviour?

不,只要值可以由枚举表示,它们就在此处。

Are there any caveats to be aware of?

如果您正在执行诸如算术之类的操作,这可能会使值超出范围,那么您将获得实现定义的结果,而不是未定义的行为。

关于c++ - 键入安全枚举位标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19267843/

相关文章:

c++ - 从源代码中删除 C++ 注释

php - 客户端同时连接多个服务器,通过连接在所有服务器执行一段代码

c - 将各个位分配给字节

python - 选择器中读/写的值状态是什么。EVENT_READ |选择器.EVENT_WRITE?

c - 按位逻辑帧

c++ - 使用 boost::shared_ptr 的集合中的不同模板类

c++ - Callable 概念和 std::is_function 类型特征有什么区别?

objective-c - Objective-C VS C 中的枚举

编译/运行时的 Java 枚举评估

c++ - 匿名枚举的使用