2014-01-31 70 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

相關問題