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
)。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/18637415,如有侵权联系删除