清洁格式标记检查的方式

时间:2014-01-31 11:40:04

标签: c++ c flags

我有一个类似的枚举(这只是一个例子):

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))
{


}

它往往变得非常大而且难以阅读。

是否有更清晰的方法来检查旗帜?例如,可以使用开关吗?

2 个答案:

答案 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;
}