Чистый способ форматирования флагов проверок

0

У меня есть enum like (это только пример):

enum tStates
{
    STOP            = (1<<0),
    PLAYING         = (1<<1),
    SYNCHRONISING       = (1<<2),
    READY_TO_PLAY       = (1<<3),
    CONNECTED       = (1<<4),
}

Таким образом, он может воспроизводиться и подключаться одновременно и т.д. Возможны сразу несколько состояний. Мне нужно протестировать разные состояния, например:

if (m_pDeviceHealth->getHealth().isSet(PLAYING))
{


}
else if (m_pDeviceHealth->getHealth().isSet(STOP))
{


}

Это, как правило, становится довольно большим и трудным для чтения.

Есть ли более четкий способ проверить флаг? Можно ли использовать, например, коммутатор?

  • 0
    Как насчет побитового ИЛИ? Например, CONNECTED | SYNCHRONISING
  • 0
    Проверьте это Q / A для побитовых операторов
Показать ещё 2 комментария
Теги:
flags

2 ответа

2
Лучший ответ

На самом деле я не знаю, как фактическая проверка флага должна быть упрощена без ваших структур данных или того, что вы хотите с этим сделать. В основном у вас есть:

if (m_pDeviceHealth->getHealth().isSet(PLAYING))
    | your expression           |      |your flag|

Для меня это кажется минимальным. Для разных флагов вам понадобятся разные ветки. Если вы хотите проверить, установлен ли какой-либо из нескольких битов, вы можете использовать маскировку бит, например:

if (m_pDeviceHealth->getHealth() & (PLAYING | SYNCHRONIZING))

в предположении, что getHealth является целым числом.

0

Это нехорошо, но если вы ищете switch, вы можете сделать комбинацию флагов самостоятельно в case s:

switch (m_pDeviceHealth->getHealth().getValue()) {
   case PLAYING:
      // ...
      break;
   case STOP:
      // ...
      break;
   case CONNECTED:
   case SYNCHRONISING:
   case SYNCHRONISING|CONNECTED:
      // ...
      break;
}
  • 1
    Это даже сработает, так как должно проверять только один бит?
  • 0
    Вы даже пытались это попробовать?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню