c++:通过关键字获取枚举值,关键字是一个变量
c++: get enum value by keyword and the keyword is a variable
在c++类Defs
中,我有一个类似enum services {1st_drink = 101, 2nd_drink = 105, seafood_outside = 200,......}
的公共枚举。我有大约200个关键词,每个关键词都有一个值。现在,在另一个类sometest
中,我需要获得特定的关键字值。关键字就像我代码中的一个变量,只有经过一些处理才能知道关键字。所以我想做的是:
.......
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 '"
。
现在我试着解决这个问题。我注意到有人在按名称获取枚举值之前问了一个类似的问题,但我不想使用这个解决方案,因为我有太多的关键字。有什么好主意吗?
您需要的是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];
如果您碰巧使用Qt应用程序框架,您可以利用Qt的元对象编译器,该编译器存储有关类的信息,以便在运行时使用。主运行中心可以识别列举。
class Defs: public QObject {
Q_OBJECT
enum Services { firstDrink = 1, secondDrink = 2, ... };
Q_ENUMS(Services)
};
当moc在上面运行并看到Q_OBJECT
时,它会添加一个类型为QMetaObject
的staticMetaObject
成员。此QMetaObject
实例具有indexOfEnumerator
和枚举器成员函数,这些函数使访问代表Defs::Services
枚举的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
我希望这能有所帮助。
作为一个可重用的通用解决方案,您可以在声明enums:时创建这样的枚举解析器模板
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);
- 如果全局变量默认是外部变量,为什么要添加"extern"关键字?
- 如何在 C++ 的 lambda 函数中传递同名的局部变量和参数(使用此关键字)?
- 初始化列表中常量变量的"this"关键字
- 为什么我应该使用extern关键字来声明命名空间范围中的变量
- 使用 C++11 auto 关键字声明两个(或多个)变量
- 用关键字声明外部本地变量
- 重写用新关键字c++初始化的变量
- 在没有“new”关键字的情况下实例化类会导致在堆栈或堆上创建其内部变量
- 为什么函数允许变量名和数据类型名,但关键字不允许
- C++ extern 关键字和全局变量
- 哪些 IDE 和文本编辑器可以推断出在 C++11 中使用 auto 关键字声明的变量类型
- 在 VC++ 中访问一个文件中声明的变量.(外部关键字用法)
- MSVC++ 限制关键字和局部变量
- 如何在C++中使用关键字"auto"声明和使用变量?
- c++:通过关键字获取枚举值,关键字是一个变量
- 如果您已经知道变量应该是常量,那么为什么要使用关键字const呢
- const/static关键字是否在变量声明中传播
- 如果我在互斥锁之间声明一个变量并返回它,我需要使用volatile关键字吗?
- 在c++中使用struct关键字声明变量
- 新关键字"auto" ;什么时候应该使用它来声明变量类型?