与所有其他类似的问题相反,这个问题是关于使用新的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';
}
约束条件
最好有的
- 支持从非零数字开始的
枚举
值 - 支持负
枚举
值 - 支持分段
枚举
值 - 支持
类枚举
(C++11) - 支持任何允许的
<type>
的class enum: <type>
(C++11) - 编译时(而非运行时)将枚举转换为字符串,或者至少在运行时快速执行(例如,
std::map
不是一个好主意...) constexpr
(C++11,然后放宽到C++14/17/20)noexcept
(C++11)- C++17/C++20友好代码片段
一个可能的想法是利用C++编译器的能力,通过基于可变参数模板类和constexpr函数的元编程技巧,在编译时生成C++代码...
std::enumerator::identifier_v<MyEnum, MyEnum::AAA>
- ecatmurDEC_ENUM(enumname, (a,b,c,(d,b),(e,42)))
并不是那么糟糕,除非您必须维护生成宏... 在我看来,将这种情况放入语言中只是另一种在缺少更强大的模板/宏混合体的情况下的替代方法。我们不应该为了能够说宏不再有用而将所有这些有用的宏用例添加到语言中。 - PlasmaHH#define
。你所问的是一个可用的解决方案。今天的正确答案是,在以后没有完全“正确”的解决方案之前(即现在接受@ecatmur)。 - antron