我希望使用一组位标志解决当前问题。这些标志被(良好地)定义为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;
}
这个重载函数是否确保了类型安全?如果将包含未在枚举中定义的值的int
强制转换,会导致未定义的行为吗?还有需要注意的任何警告吗?
operator|(FIVE, SIX) == 0x30
。哪个ENUM常量的值为0x30
? - Adam