我希望为我当前的问题使用一组位标志。这些标志(很好地)定义为 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/