C++ 中,直接打印枚举的名称

在 C++ 中,直接打印枚举的名称并不容易,因为枚举本质上是整数类型,编译后的程序不会保存枚举名称的字符串形式。但是,有一些方法可以实现这个功能。

方法 1:手动映射(常用方法)

使用一个映射表或 switch 语句,将枚举值与其对应的名称关联起来。

#include <iostream>
#include <string>

enum Color {
    RED,
    GREEN,
    BLUE
};

std::string colorToString(Color color) {
    switch (color) {
        case RED:   return "RED";
        case GREEN: return "GREEN";
        case BLUE:  return "BLUE";
        default:    return "UNKNOWN";
    }
}

int main() {
    Color c = GREEN;
    std::cout << "Color: " << colorToString(c) << std::endl;
    return 0;
}

方法 2:使用宏生成映射

通过宏定义枚举和其对应的字符串。

#include <iostream>
#include <string>

#define ENUM_TO_STRING(ENUM) #ENUM

enum Color {
    RED,
    GREEN,
    BLUE
};

const char* colorToString(Color color) {
    switch (color) {
        case RED:   return ENUM_TO_STRING(RED);
        case GREEN: return ENUM_TO_STRING(GREEN);
        case BLUE:  return ENUM_TO_STRING(BLUE);
        default:    return "UNKNOWN";
    }
}

int main() {
    Color c = BLUE;
    std::cout << "Color: " << colorToString(c) << std::endl;
    return 0;
}

方法 3:C++11 std::map 映射

通过 std::map 映射枚举值和名称。

#include <iostream>
#include <map>
#include <string>

enum Color {
    RED,
    GREEN,
    BLUE
};

std::map<Color, std::string> colorMap = {
    {RED, "RED"},
    {GREEN, "GREEN"},
    {BLUE, "BLUE"}
};

int main() {
    Color c = RED;
    std::cout << "Color: " << colorMap[c] << std::endl;
    return 0;
}

方法 4:第三方库(如 magic_enum

magic_enum 是一个 C++17/20 库,可以在编译时获取枚举的字符串表示。

#include <iostream>
#include <string>
#include <magic_enum.hpp>

enum class Color {
    RED,
    GREEN,
    BLUE
};

int main() {
    Color c = Color::GREEN;
    std::cout << "Color: " << magic_enum::enum_name(c) << std::endl;
    return 0;
}

magic_enum 的优点是可以自动生成枚举名称,但需要支持 C++17 或更高版本,且需要额外安装此库。

总结

  • 如果环境支持,推荐使用 magic_enum
  • 如果需要兼容性和简单性,可以手动实现映射(如 switch 或 std::map)。
posted @   海_纳百川  阅读(128)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
本站总访问量8979601
 
点击右上角即可分享
微信分享提示