如何从其值中获取枚举项名称

Nan*_* HE 34 c++ enums

我声明了枚举类型,

enum WeekEnum
{
Mon = 0;
Tue = 1;
Wed = 2;
Thu = 3;
Fri = 4;
Sat = 5;
Sun = 6;
};
Run Code Online (Sandbox Code Playgroud)

当我已经有项目值"0,1,等"时,如何获得项目名称"Mon,Tue等"

我已经有了这个功能

Log(Today is "2", enjoy! );

现在我想要下面的输出

今天是星期三,享受

Luc*_*ore 27

你不能直接,enum在C++中不像Java枚举.

通常的方法是创建一个std::map<WeekEnum,std::string>.

std::map<WeekEnum,std::string> m;
m[Mon] = "Monday";
//...
m[Sun] = "Sunday";
Run Code Online (Sandbox Code Playgroud)

  • 我可能在地图前使用数组. (21认同)
  • @Darwyn:哈希表上的查找是O(1),但对于哈希方程,它有一个很大的常量.对数组的查找操作实际上是直接索引,不涉及搜索或等式.`m [Mon]`被编译器视为`m [1]`,它通常是单个操作码.您正在考虑按值而不是按索引查找数组. (9认同)
  • @Darwyn:只要保留正确的大小,阵列就更无条件.这是一个简单的读取或写入索引操作,并且永远不会插入或删除. (4认同)
  • 使用数组也可能意味着枚举值是连续的。尽管实际上在实践中声明的大多数枚举可能是连续的,但在语言中没有任何强制性的枚举。 (3认同)
  • @MooingDuck你是对的,我错误地认为按值查找而不是按索引查找。谢谢。 (2认同)

Rol*_*dXu 9

不,你无法从C++中的值中获取"名称",因为在编译时会丢弃所有符号.

您可能需要这种方式X宏

  • 这个答案太“全面”了。没有理由为什么“__ENUM_NAME__(x)”不存在,因为已经有“__FUNCTION__、__PRETTY_FUNCTION__”等东西了。编译器人员可以为枚举提供类似的解决方案。Rust 与“#[derive(Debug)]”或“#[derive(Display)]”类似。Haskell 有“deriving Show”作为编译器的好东西,它的作用是相同的。 (4认同)

Cos*_*ine 9

枚举是反向数组的东西.我相信你想要的是:

const char * Week[] = { "", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };  // The blank string at the beginning is so that Sunday is 1 instead of 0.
cout << "Today is " << Week[2] << ", enjoy!";  // Or whatever you'de like to do with it.
Run Code Online (Sandbox Code Playgroud)

  • 枚举和数组是两个非常不同的东西. (4认同)
  • 那是正确的。枚举将(源)字符串与数字匹配,而数组可以将数字与字符串匹配。(看到关系了吗?)OP的标题不能直接实现,但她的核心问题可以。由于她的示例的名称按数字顺序排列,因此她可以使用数组而不是 std::map(后者更重)。因此,尽管没有回答她的标题问题,数组可能正是 OP 所需要的。 (2认同)

Pup*_*ppy 6

您可以定义执行输出的运算符.

std::ostream& operator<<(std::ostream& lhs, WeekEnum e) {
    switch(e) {
    case Monday: lhs << "Monday"; break;
    .. etc
    }
    return lhs;
}
Run Code Online (Sandbox Code Playgroud)


Kil*_*Kid 6

这是使用X宏定义枚举的另一个巧妙技巧:

#include <iostream>

#define WEEK_DAYS \
X(MON, "Monday", true) \
X(TUE, "Tuesday", true) \
X(WED, "Wednesday", true) \
X(THU, "Thursday", true) \
X(FRI, "Friday", true) \
X(SAT, "Saturday", false) \
X(SUN, "Sunday", false)

#define X(day, name, workday) day,
enum WeekDay : size_t
{
    WEEK_DAYS
};
#undef X

#define X(day, name, workday) name,
char const *weekday_name[] =
{
    WEEK_DAYS
};
#undef X

#define X(day, name, workday) workday,
bool weekday_workday[]
{
    WEEK_DAYS
};
#undef X

int main()
{
    std::cout << "Enum value: " << WeekDay::THU << std::endl;
    std::cout << "Name string: " << weekday_name[WeekDay::THU] << std::endl;
    std::cout << std::boolalpha << "Work day: " << weekday_workday[WeekDay::THU] << std::endl;

    WeekDay wd = SUN;
    std::cout << "Enum value: " << wd << std::endl;
    std::cout << "Name string: " << weekday_name[wd] << std::endl;
    std::cout << std::boolalpha << "Work day: " << weekday_workday[wd] << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现场演示:https : //ideone.com/bPAVTM

输出:

Enum value: 3
Name string: Thursday
Work day: true
Enum value: 6
Name string: Sunday
Work day: false
Run Code Online (Sandbox Code Playgroud)

  • 感谢您提到这种方法。TIL [X 宏](https://en.wikipedia.org/wiki/X_Macro) (3认同)