【发布时间】:2020-10-01 08:45:15
【问题描述】:
我经常在以下代码中使用类似的东西:
// 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, "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> emap;
std::map<MySEnum, int> semap;
};
// myclass.cc
#include "myclass.h"
MyVariableEnumClass MyClass::MySEnum = MyVariableEnumClass(SE1, "se1", SE2, "se2");
有没有办法实现这样的“无杂乱”?也许使用宏?
【问题讨论】:
-
有点,我想。缺点是它需要 c++17,而我使用的是 c++11,另外我想指定(可能有不同的命名)附加到每个枚举的字符/字符串(
E1和"e1"),而magic_enum似乎对两者有相同的命名(E1和"E1")。 -
有时使用的一个技巧是有一个定义枚举值的头文件,像这样:
ENUM_VALUE(SE1, "se1")(更像这样)。文件本身没有定义ENUM_VALUE。然后你#include 这个头两次——一次定义ENUM_VALUE以发出枚举值的方式,然后再次定义它以发出字符串文字。所以你可以从同一个源生成MyEnum和kMyEnum。 -
另一个技巧是用自己选择的脚本语言定义数据,然后编写一个脚本自动生成 C++ 代码。