【发布时间】:2018-04-27 02:49:05
【问题描述】:
我认为可以使用 C++11 中引入的可变参数模板参数来初始化一个映射,其中键是整数,值是给定参数的字符串表示法。
如果可能的话,我可以简单地创建一个从枚举名称到它的字符串表示的映射,如下所示:
auto map = EnumStringMap<EnumType::Type1, EnumType::Type2>();
我可以通过这个模板用枚举 int 表示初始化一个列表
template<typename... Ts> auto enumList(Ts... args){
QList<int> res = {args...};
return res;
}
auto enums = enumList<int, int>(Enums::Enum1, Enums::Enum2);
我认为应该可以使用 STRINGFY C 宏来获取表达式的字符串表示
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
但我不知道如何将类型名称或类型值转换为它的字符串表示形式,所以有可能吗? 我的目标是生成一个映射,它在编译时保存枚举的字符串表示。
qt 使用的 MOC 等方法不适合我,因为我应该将枚举包含在 QObject 中,这很重且不可复制。
【问题讨论】:
-
AFAIK 这在 C++ 中是不可能的。尽管在 C# 中可能。我会自己创建这样的映射(静态)
EnumStringMap<EnumType, std::string>。 -
BETTER_ENUMS 等库常用的方法是使用 MACRO 来定义枚举。 (直到我们对此进行反思)。
-
@vahancho 对于大量枚举(可能超过 500 个),手动维护它非常困难