我有一个类似的枚举(这只是一个例子):
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 :(得分:2)
实际上我不知道如果没有你的数据结构或你想用它做什么,实际的标志检查应该如何变得更简单。基本上你拥有的是:
if (m_pDeviceHealth->getHealth().isSet(PLAYING))
| your expression | |your flag|
对我来说似乎很少。对于不同的标志,你显然需要不同的if分支。 如果要查看是否设置了多个位中的任何一个,可以使用位掩码,如:
if (m_pDeviceHealth->getHealth() & (PLAYING | SYNCHRONIZING))
假设getHealth是一个整数。
答案 1 :(得分:0)
这不好,但如果您正在寻找switch
,您可以在case
s中自行标记组合:
switch (m_pDeviceHealth->getHealth().getValue()) {
case PLAYING:
// ...
break;
case STOP:
// ...
break;
case CONNECTED:
case SYNCHRONISING:
case SYNCHRONISING|CONNECTED:
// ...
break;
}