Присвоение переменной перечисления побитового ИЛИ констант этого перечисления
От: Аноним  
Дата: 29.08.13 13:12
Оценка:
Могут ли быть проблемы в таком использовании переменной перечисления, учитывая что (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);
Re: Присвоение переменной перечисления побитового ИЛИ констант этого перечислени
От: Кодт Россия  
Дата: 29.08.13 14:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Могут ли быть проблемы в таком использовании переменной перечисления, учитывая что (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,
};
Перекуём баги на фичи!
Re[2]: Присвоение переменной перечисления побитового ИЛИ констант этого перечисл
От: flаt  
Дата: 29.08.13 16:49
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Проблема лишь в том, что flag_a|flag_b — это не SomeFlags, а просто int (или другой подходящий целый тип, в соответствии с правилами целочисленного продвижения).

К>Поэтому на f(flag_a|flag_b) компилятор будет ругаться.
Можно перегрузить операторы |, & и будет совсем хорошо.
Re[2]: Присвоение переменной перечисления побитового ИЛИ констант этого перечисл
От: Шахтер Интернет  
Дата: 29.08.13 17:00
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, Аноним, Вы писали:


А>>Могут ли быть проблемы в таком использовании переменной перечисления, учитывая что (flag_a | flag_b) не принадлежит перечислению)?


К>Проблема лишь в том, что flag_a|flag_b — это не SomeFlags, а просто int (или другой подходящий целый тип, в соответствии с правилами целочисленного продвижения).

К>Поэтому на f(flag_a|flag_b) компилятор будет ругаться.
К>А в остальном, проблем нет.

Ещё следовало бы объявить базовый тип беззнаковым.


enum SomeFlags : unsigned
 {
 };
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.