Могут ли быть проблемы в таком использовании переменной перечисления, учитывая что (flag_a | flag_b) не принадлежит перечислению)?
enum Some_flags
{
none = 0,
flag_a = 2,
flag_b = 4,
/****/
flag_n = 2^n
};
void f(Some_flags flags)
{
if(flags & flag_a) {/**/}
if(flags & flag_b) {/**/}
}
f( flag_a | flag_b);
Здравствуйте, Аноним, Вы писали:
А>Могут ли быть проблемы в таком использовании переменной перечисления, учитывая что (flag_a | flag_b) не принадлежит перечислению)?
Проблема лишь в том, что flag_a|flag_b — это не SomeFlags, а просто int (или другой подходящий целый тип, в соответствии с правилами целочисленного продвижения).
Поэтому на f(flag_a|flag_b) компилятор будет ругаться.
А в остальном, проблем нет.
Да, кстати. Битовые флаги удобно не вручную высчитывать (сколько там будет 2^29?), а писать на сдвигах
enum SomeFlags {
flag_a = 1<<0,
flag_b = 1<<1,
.....
flag_n = 1<<n,
};
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Аноним, Вы писали:
А>>Могут ли быть проблемы в таком использовании переменной перечисления, учитывая что (flag_a | flag_b) не принадлежит перечислению)?
К>Проблема лишь в том, что flag_a|flag_b — это не SomeFlags, а просто int (или другой подходящий целый тип, в соответствии с правилами целочисленного продвижения).
К>Поэтому на f(flag_a|flag_b) компилятор будет ругаться.
К>А в остальном, проблем нет.
Ещё следовало бы объявить базовый тип беззнаковым.
enum SomeFlags : unsigned
{
};