2015-12-18 79 views
0

在一個C++類Defs我有一個公共枚舉類似enum services {1st_drink = 101, 2nd_drink = 105, seafood_outside = 200,......}。我有大約200個關鍵字,每個關鍵字都有一個值。現在在另一個類sometest我需要獲得特定的關鍵字值。關鍵字就像我的代碼中的一個變量,我只能在處理完一些關鍵字後才能知道。因此,我想要做的是這樣的:C++:通過關鍵字獲得枚舉值,關鍵字是一個變量

....... 
std::string keyword = string1 + "_" + string2; 
unsigned int a = Defs::keyword; 
....... 

但現在,當我嘗試這樣做,我得到錯誤"error C2039: 'keyword': is not a member of 'Defs'""error C2440: '=': cannot convert from 'std::string' to 'const unsigned int '"

現在我試着解決這個問題。我注意到有人在Get enum value by name之前問過類似的問題,但由於關鍵字太多,我不想使用該解決方案。任何好主意來做到這一點?

+0

只是爲了讓自己明白這個問題:你想從數字中得到字符串? – Sossenbinder

+0

您鏈接的接受答案的第二部分僅定義枚舉值一次。因爲你需要定義那個應該爲你工作的枚舉。 – Kevin

+0

不,我想從其他條件和計算的字符串,我想字符串的數字 – gladys0313

回答

4

你需要的是一個std::map<std::string, unsigned int>

#include <map> 
#include <string> 

const std::map<std::string, unsigned int> services = { 
    { "1st_drink", 101 }, 
    { "2nd_drink", 200 }, 
    // ... 
}; 

const std::string keyword = string1 + "_" + string2; 
const unsigned int a = services[keyword]; 
+2

我認爲這是唯一正確的答案。 OP可能不希望這樣,但我認爲旁邊沒有類似的簡單方法。我知道C#可以做到這一點(所以Java很可能也能做到這一點),但C++不能。 – Sossenbinder

+0

@YSC非常感謝您的回答!我想把地圖'services'放入類'sometest'中的'Defs'類並執行'services [keyword]'。我包含了'Defs'類,但是當我這樣做時,我得到錯誤'錯誤C2065:'services':未聲明的標識符'。爲什麼會發生這種情況' – gladys0313

+0

@ gladys0313這是另一個問題,你爲什麼不打開一個新的發佈你的班級代碼?我們很樂意爲您提供幫助。 – YSC

0

作爲一種可重複使用的通用的解決方案,你可以聲明枚舉時創建這樣枚舉解析器模板:

template <typename T> 
class EnumParser 
{ 
    map <string, T> enumMap; 
    T defaultValue; 
public: 
    EnumParser(){}; 

    T Parse(const string &value) 
    { 
     map <string, T>::const_iterator iValue = enumMap.find(value); 
     if (iValue == enumMap.end()) 
      return defaultValue; 
     return iValue->second; 
    }  
}; 

您可以使用實例它像這樣:

enum class Services 
{ 
    DeFault, 
    First_drink = 101, 
    Second_drink = 105, 
    seafood_outside = 200, 
}; 

EnumParser<Services>::EnumParser() : defaultValue(Services::DeFault) 
{ 
    enumMap["DeFault"] = Services::DeFault; 
    enumMap["First_drink"] = Services::First_drink; 
    enumMap["Second_drink"] = Services::Second_drink; 
    enumMap["seafood_outside"] = Services::seafood_outside; 
} 

然後像這樣使用它:

int value= (int)EnumParser<Services>().Parse(keyword); 
1

如果你碰巧在使用Qt應用程序框架,你可以利用Qt的元對象編譯器來存儲關於類的信息以便在運行時使用。 MOC可以識別枚舉。

class Defs: public QObject { 
    Q_OBJECT 
    enum Services { firstDrink = 1, secondDrink = 2, ... }; 
    Q_ENUMS(Services) 
}; 

當上述MOC運行並看到Q_OBJECT其添加QMetaObject類型的staticMetaObject構件。此QMetaObject實例具有indexOfEnumerator和枚舉器成員函數,可以訪問代表Defs::Services enum的QMetaEnum

代碼訪問QMetaEnum成員看起來像下面這樣:

const QMetaObject &mo = Defuns::staticMetaObject; 
int index = mo.indexOfEnumerator("Services"); 
QMetaEnum metaEnum = mo.enumerator(index); 

然後,我們可以使用QMetaEnum對象如下:

// first, let's convert from an enum value to a string 
Services s = Defs::firstDrink; 
QByteArray str = metaEnum.valueToKey(s); 
// str now contains "firstDrink" 

// second, let's convert from a string to an enum value: 
int value = metaEnum.keyToValue("firstDrink"); 
// value now contains the integer 1 

我希望這有助於。