在现代C ++ 11 / C ++ 14 / C ++ 17和未来的C ++ 20中枚举到字符串

在现代C ++ 11 / C ++ 14 / C ++ 17和未来的C ++ 20中枚举到字符串

一个例子通常比长期解释更好。
您可以在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';}

约束

  • 请不要重复其他答案基本链接

  • 请避免膨胀的基于宏的答案,或尝试尽可能减少#define开销。

  • 请不要手动enum- > string映射。

很高兴有

  • 支持enum从不同于零的数字开始的值

  • 支持负的enum

  • 支持零碎的enum价值观

  • 支持class enum(C ++ 11)

  • 支持class enum : <type>任何允许<type>(C ++ 11)

  • 编译时(不是运行时)转换为字符串,
    或至少在运行时快速执行(例如,std::map这不是一个好主意......)

  • constexpr (C ++ 11,在C ++中放松14)

  • noexcept (C ++ 11)

  • 片段C ++ 14 / C ++ 17友好

  • C ++ 最先进的技术

一个可能的想法是使用C ++编译器功能在编译时使用基于variadic template classconstexpr函数的元编程技巧生成C ++代码......


桃花长相依
浏览 639回答 2
2回答
打开App,查看更多内容
随时随地看视频慕课网APP