Я хочу использовать набор битовых флагов для моей текущей проблемы. Эти флаги (красиво) определены как часть 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
значения, не определенные в перечислении, вызывает поведение undefined? Есть ли какие-либо оговорки, о которых нужно знать?