2012-08-03 53 views
0

我一直在考慮,看起來或多或少像這樣將標誌組合映射到枚舉的最簡單方法是什麼?

enum foo{ 
X, 
XandY, 
XandZ, 
XandYandZ, 
none, 
Y, 
Z, 
YandZ, 
someSpecialCase, 
anotherSpecialCase 
}; 

我有穿過管道幾個消息對象,如果這個消息有X或不特定的階段決定,另外一個決定枚舉類型如果它有Y或不等等。最終,消息需要用這些標籤中的一個來標記。我設計了消息對象,但枚舉已經定義。我不想讓任何枚舉數值。所以我把布爾標誌,如hasX,hasY,可以在不同階段單獨設置。有沒有比只寫幾層嵌套的if-else子句更好的方法?

爲了清晰起見
再次編輯,更改了變量名稱。

+1

你試過開關盒嗎? – 2012-08-03 12:45:48

+0

你能清楚輸入嗎?你給了一個枚舉值,還是你給了X,Y和Z來確定一個枚舉值? – 2012-08-03 12:58:17

+0

爲了清晰起見進行了編輯。我需要分配這些標籤中的一個。 – 2012-08-03 13:32:31

回答

2

如果我正確地理解了這個問題,那麼基本上你所說的是一個多路複用器。即將幾個信息流組合成一個。這可以使用查找表輕鬆實現,並且這取決於您的實施。

您可以將各種輸入流組合成一個關鍵對象。 我已經在下面包含一些代碼,但沒有時間檢查/運行它,所以請把它當作僞碼而不是逐字。

使用地圖

struct MyKey 
{ 
    MyKey(bool X, bool Y, bool Z, bool SC1, bool SC2) : 
     X_(X), Y_(Y), Z_(Z), SC1_(SC1), SC2_(SC2) {} 

    bool X_; 
    bool Y_; 
    bool Z_; 
    bool SC1_; 
    bool SC2_; 
}; 

您還需要爲了在關聯容器使用此一功能operator<()。然後你建立一個映射集如地圖:

typedef enum foo FooEnum; 
std::map< MyKey, FooEnum > myMap; 

此地圖需要進行設置,當你的應用程序啓動和加載一個類似如下:

myMap.insert(std::make_pair< MyKey, FooEnum >(MyKey(true,false,true,false,false), XandZ)); 

該地圖X和Z只有對XandZ真實,所以你需要這個每個排列。

一旦你過來做檢查,那麼只需將是:

std::map< MyKey, FooEnum >::const_iterator it = myMap.find(MyKey(X,Y,Z,SC1,SC2)); 
if (it != myMap.end()) 
{ 
    enum foo valueINeed = it.second; 
    // ... 

使用矢量/陣列

有一些這方面的變化。例如,您可以將輸入流的值作爲掩碼中的位(此處爲5位),並使用32個元素的數組或向量將每個置換映射到單獨的元素。

如果你這樣做,你甚至可以在編譯時創建集合。儘管你不得不測試它,但它可能會運行得更快一些。缺點是代碼可能更深奧一點,但是再也沒有針對文檔的法律!

相關問題