У меня есть 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))
{
}
Это, как правило, становится довольно большим и трудным для чтения.
Есть ли более четкий способ проверить флаг? Можно ли использовать, например, коммутатор?
На самом деле я не знаю, как фактическая проверка флага должна быть упрощена без ваших структур данных или того, что вы хотите с этим сделать. В основном у вас есть:
if (m_pDeviceHealth->getHealth().isSet(PLAYING))
| your expression | |your flag|
Для меня это кажется минимальным. Для разных флагов вам понадобятся разные ветки. Если вы хотите проверить, установлен ли какой-либо из нескольких битов, вы можете использовать маскировку бит, например:
if (m_pDeviceHealth->getHealth() & (PLAYING | SYNCHRONIZING))
в предположении, что getHealth является целым числом.
Это нехорошо, но если вы ищете switch
, вы можете сделать комбинацию флагов самостоятельно в case
s:
switch (m_pDeviceHealth->getHealth().getValue()) {
case PLAYING:
// ...
break;
case STOP:
// ...
break;
case CONNECTED:
case SYNCHRONISING:
case SYNCHRONISING|CONNECTED:
// ...
break;
}
CONNECTED | SYNCHRONISING