Я ищу, чтобы использовать набор битовых флагов для моей текущей проблемы. Эти флаги (красиво) определены как часть enum
, однако я понимаю, что когда вы используете OR
два значения из перечисления, тип возврата операции OR
имеет тип int
.Введите безопасные флаги бит enum
То, что я в настоящее время ищет решение, которое позволит пользователям битовой маски, чтобы оставаться в безопасности типа, как таковой я создал такую перегрузку 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
, содержащий значения, не определенные в перечислении, вызывает неопределенное поведение? Есть ли какие-либо оговорки, о которых нужно знать?
'оператора | (пяти-, шести-) == 0x30'. Что константа ENUM имеет значение '0x30'? – Adam
Я бы не делал никакой формы сравнения по результирующему значению, я бы просто проверял флаги. – ctor
Тогда результат ИЛИ должен оставаться в int. – Adam