如何解决C ++中的变量枚举“类”
我经常在以下代码中使用类似的东西:
// myclass.h
class MyClass {
public:
enum MyEnum { E1,E2,NUMMYENUM };
const char* kMyEnum[NUMMYENUM] = {"e1","e2"};
const char* MyEnum2Char(MyEnum me) { return kMyEnum[me]; }
enum MySEnum { SE1,SE2,NUMMYSENUM };
static const char* kMySEnum[NUMMYSENUM];
static const char* MySEnum2Char(MySEnum se) { return kMySEnum[se]; }
void foo(MyEnum me) {
//do something,e.g. print
std::cout << MyEnum2Char(me) << "maps to " << emap[me] << "\n";
}
void bar(MySEnum se) {
//do something,e.g. print
std::cout << MySEnum2Char(se) << "maps to " << semap[se] << "\n";
}
private:
std::map<MyEnum,int> emap;
std::map<MySEnum,int> semap;
};
// myclass.cc
#include "myclass.h"
const char* MyClass::kMySEnum[MyClass::MySEnum::NUMMYSENUM] = {"se1","se2"};
生成enum
,char*
数组和将enum
转换为char
的函数的方式似乎增加了可避免的混乱,我想知道是否没有实现这一目标的另一种方法?出于多种原因,无法进行以下操作,但可能会让您了解我想要的东西:
// myclass.h
class MyClass {
public:
MyVariableEnumClass MyEnum(E1,"e1","e2");
static MyVariableEnumClass MySEnum;
void foo(MyEnum me) {
//do something,e.g. print
std::cout << me.string() << "maps to " << emap[me] << "\n";
}
void bar(MySEnum se) {
//do something,e.g. print
std::cout << se.string() << "maps to " << semap[se] << "\n";
}
private:
std::map<MyEnum,int> semap;
};
// myclass.cc
#include "myclass.h"
MyVariableEnumClass MyClass::MySEnum = MyVariableEnumClass(SE1,"se1","se2");
是否有办法实现类似“无杂物”的目标?也许使用宏?
解决方法
一种名为XMacro的技术可以在C ++ 11以及较旧的C ++和C版本中使用,以轻松定义一致的查找表,以将枚举转换为字符串。
首先,您编写一个包含以下内容的外部文件(我们称其为my_class.xmacro):
#define SE_ENUM_TABLE \
ENTRY(SE1) \
ENTRY(SE2)
接下来,在H文件中,包含my_class.xmacro,定义以下内容:
#include "my_class.xmacro"
enum SeEnum{
#define ENTRY(a) a,SE_ENUM_TABLE
#undef ENTRY
};
const std::string seEnumString[] = {
#define str_macro(a) #a
#define ENTRY(a) str_macro(a),SE_ENUM_TABLE
#undef ENTRY
};
seEnumStringId内部的宏采用ENTRY(a)并将其转换为“ a”。因此,在预处理程序完成此文件之后,它实际上对编译器的外观如下:
enum SeEnum{
SE1,SE2
};
const std::string seEnumString[] = {
"SE1","SE2"
};
使用此技术,您可以确保添加枚举会自动按RIGHT顺序创建字符串ID,并且该技术还可用于生成其他类型的查找表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。