与所有其他类似问题相反,这个问题是关于使用新的 C++ 功能。
- 2008 c 有没有一种简单的方法可以将 C++ 枚举转换为字符串?
- 2008 c 在 C 中使用枚举类型的变量作为字符串的简单方法?
- 2008 c++ 如何轻松地将 c++ 枚举映射到字符串
- 2008 c++ 制作一个 C 标识符和一个字符串?
- 2008 c++ 是否有一个简单的脚本可以将 C++ 枚举转换为字符串?
- 2009 c++ 如何在 C++ 中使用枚举作为标志?
- 2011 c++ 如何将枚举类型变量转换为字符串?
- 2011 c++ 枚举到字符串 C++
- 2011 c++ 如何将枚举类型变量转换为字符串?
- 2012 c 如何在 c 中将枚举名称转换为字符串
- 2013 c 在 C 中对条件编译的枚举进行字符串化
在阅读了许多答案后,我还没有找到任何答案:
例子
一个例子通常比一个冗长的解释更好。
您可以在 Coliru 上编译和运行此代码段。
(也可以使用 另一个以前的示例)
#include <map>
#include <iostream>
struct MyClass
{
enum class MyEnum : char {
AAA = -8,
BBB = '8',
CCC = AAA + BBB
};
};
// Replace magic() by some faster compile-time generated code
// (you're allowed to replace the return type with std::string
// if that's easier for you)
const char* magic (MyClass::MyEnum e)
{
const std::map<MyClass::MyEnum,const char*> MyEnumStrings {
{ MyClass::MyEnum::AAA, "MyClass::MyEnum::AAA" },
{ MyClass::MyEnum::BBB, "MyClass::MyEnum::BBB" },
{ MyClass::MyEnum::CCC, "MyClass::MyEnum::CCC" }
};
auto it = MyEnumStrings.find(e);
return it == MyEnumStrings.end() ? "Out of range" : it->second;
}
int main()
{
std::cout << magic(MyClass::MyEnum::AAA) <<'\n';
std::cout << magic(MyClass::MyEnum::BBB) <<'\n';
std::cout << magic(MyClass::MyEnum::CCC) <<'\n';
}
约束
很高兴有
- 支持
enum
从非零的数字开始的值 - 支持负值
enum
值 - 支持分片
enum
值 - 支持
class enum
(C++11) - 支持
class enum : <type>
有任何允许的<type>
(C++11) - 编译时(不是运行时)转换为字符串,
或者至少在运行时快速执行(例如 std::map
不是一个好主意……)
- constexpr
(C++11,然后在 C++14/17/20 中放宽)
- noexcept
(C++11)
- C++17 / C++20 友好代码片段
一种可能的想法是使用 C++ 编译器功能在编译时使用基于 variadic template class
和 constexpr
函数的元编程技巧生成 C++ 代码…
原文由 oHo 发布,翻译遵循 CC BY-SA 4.0 许可协议
Magic Enum 仅标头库为 C++17 的枚举(到字符串、从字符串、迭代)提供静态反射。
有关更多示例,请查看主页存储库 https://github.com/Neargye/magic_enum 。
缺点在哪里?
该库使用特定于编译器的 hack(基于
__PRETTY_FUNCTION__
/__FUNCSIG__
),适用于 Clang >= 5、MSVC >= 15.3 和 GCC >= 9。枚举值必须在
[MAGIC_ENUM_RANGE_MIN, MAGIC_ENUM_RANGE_MAX]
范围内。默认情况下
MAGIC_ENUM_RANGE_MIN = -128
,MAGIC_ENUM_RANGE_MAX = 128
。如果默认情况下需要所有枚举类型的另一个范围,请重新定义宏
MAGIC_ENUM_RANGE_MIN
和MAGIC_ENUM_RANGE_MAX
。MAGIC_ENUM_RANGE_MIN
必须小于或等于0
并且必须大于INT16_MIN
。MAGIC_ENUM_RANGE_MAX
必须大于0
并且必须小于INT16_MAX
。如果需要特定枚举类型的另一个范围,请为必要的枚举类型添加专门化 enum_range。