2015-12-18 55 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 

我希望这有助于。