2014-01-31 34 views
0

我有一个像枚举(这只是一个例子):以格式标志清晰的方式检查

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

按位OR如何?例如。 '连接| SYNCHRONISING' –

+0

查看[this Q/A](http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-cc)按位运营商 – Griddo

+0

更新了问题 – dyesdyes

回答

2

其实我不知道如何实际标志检查应没有更简单的数据结构或你想要做什么。基本上你有什么是:

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

似乎对我来说很小。对于不同的标志,你显然需要不同的分支。假设getHealth是一个整数下

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

: 如果你正在寻找检查如果有多个位的设置,你可以使用位屏蔽等。

0

这不是很好,但如果你正在寻找一个switch,你可以做自己的标志组合case S:

switch (m_pDeviceHealth->getHealth().getValue()) { 
    case PLAYING: 
     // ... 
     break; 
    case STOP: 
     // ... 
     break; 
    case CONNECTED: 
    case SYNCHRONISING: 
    case SYNCHRONISING|CONNECTED: 
     // ... 
     break; 
} 
+1

它是否会工作,因为它应该只检查一个位? – dyesdyes

+0

你是否打算试试这个? –

+1

@LightnessRacesinOrbit出了什么问题?我想他想指出的是,你可以在case case语句中使用按位运算符,如case SYNCHRONIZING | CONNECTED。但我认为这不是真的'干净'... – Griddo

相关问题