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

新手上路,请多包涵

我声明了一个枚举类型,

 enum WeekEnum
{
Mon = 0;
Tue = 1;
Wed = 2;
Thu = 3;
Fri = 4;
Sat = 5;
Sun = 6;
};

当我已经拥有项目值“0、1 等”时,如何获取项目名称“周一、周二等”?

我已经有这样的功能

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

现在我想要下面的输出

今天是星期三,好好享受

原文由 Nano HE 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
1 个回答

可能不是有史以来最好的解决方案,但这可以很好地完成工作。

枚举的名称是延迟加载的,因此在第一次调用 to_string 之后,它将被加载并保存在内存中。

方法 from_string 没有实现,因为这里没有请求,但是可以通过调用 get_enum_names 轻松实现,在向量中搜索名称,并将其位置转换为枚举类型.

请在cpp文件中添加 get_enum_names 的定义(只有声明应该在头文件中)。

它应该适用于 C++ >= 11

在 gcc 和 MSVC 中测试

执行:

 #include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <unordered_map>

// Add the definition of this method into a cpp file. (only the declaration in the header)
const std::vector<std::string>& get_enum_names(const std::string& en_key, const std::string& en_str)
{
    static std::unordered_map<std::string, std::vector<std::string>> en_names_map;
    const auto it = en_names_map.find(en_key);
    if (it != en_names_map.end())
        return it->second;

    constexpr auto delim(',');
    std::vector<std::string> en_names;
    std::size_t start{};
    auto end = en_str.find(delim);
    while (end != std::string::npos)
    {
        while (en_str[start] == ' ')
            ++start;
        en_names.push_back(en_str.substr(start, end - start));
        start = end + 1;
        end = en_str.find(delim, start);
    }
    while (en_str[start] == ' ')
        ++start;
    en_names.push_back(en_str.substr(start));
    return en_names_map.emplace(en_key, std::move(en_names)).first->second;
}

#define DECLARE_ENUM(ENUM_NAME, ...)   \
    enum class ENUM_NAME{ __VA_ARGS__ }; \
    inline std::string to_string(ENUM_NAME en) \
    { \
        const auto& names = get_enum_names(#ENUM_NAME #__VA_ARGS__, #__VA_ARGS__); \
        return names[static_cast<std::size_t>(en)]; \
    }

用法:

 DECLARE_ENUM(WeekEnum, Mon, Tue, Wed, Thu, Fri, Sat, Sun);

int main()
{
    WeekEnum weekDay = WeekEnum::Wed;
    std::cout << to_string(weekDay) << std::endl; // prints Wed
    std::cout << to_string(WeekEnum::Sat) << std::endl; // prints Sat
    return 0;
}

原文由 rflobao 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题