键入安全枚举位标志

cto*_*tor 12 c++ enums bitwise-operators c++03

我想为我当前的问题使用一组位标志.这些标志(很好地)被定义为一部分enum,但是据我所知,当你OR从枚举中获得两个值时,OR操作的返回类型具有类型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;
}
Run Code Online (Sandbox Code Playgroud)

这种过载真的能提供类型安全吗?是否int在枚举中输入未定义的包含值会导致未定义的行为?有什么需要注意的注意事项吗?

Mik*_*our 6

这种过载真的能提供类型安全吗?

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

是否转换包含未在枚举中定义的值的int会导致未定义的行为吗?

不,只要这些值可以通过枚举表示,它们就在这里.

有什么需要注意的注意事项吗?

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