千家信息网

如何解决c++11实现枚举值到枚举名的转换问题

发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇文章主要介绍如何解决c++11实现枚举值到枚举名的转换问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!效果ENUM_DEFINE ( Color, Red,
千家信息网最后更新 2025年11月16日如何解决c++11实现枚举值到枚举名的转换问题

这篇文章主要介绍如何解决c++11实现枚举值到枚举名的转换问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

效果

ENUM_DEFINE ( Color,    Red,    Blue,)EnumHelper(Color::Red) -> "Red"EnumHelper(Color::Red, std::toupper) -> "RED"

关键技术

__VA_ARGS__

__VA_ARGS__ 实现了可变参数的宏。

#define XXX(type, ...) enum class type { __VA_ARGS__ };

XXX(Color, Red, Blue) 等价于:

enum class Color{    Red,    Blue};

#__VA_ARGS__

#__VA_ARGS__ 可将宏的可变参数转为字符串。

#define XXX(type, ...) #__VA_ARGS__

XXX(Color, Red, Blue) 等价于:"Red, Blue"

在函数外执行代码的能力

在函数体外,可以通过定义全局变量来执行一个函数。需要注意的是,头文件中正常是不能进行变量初始化的,除非加上 static 或者 const

const int temp = initialize();

另外,如果多个代码文件 #include 了该头文件,会产生多个变量,即在不同代码文件取得的 temp 变量不是同一个。与之对应,initialize 函数也会调用多次。

模板函数的静态变量

函数的静态变量可以用于存放枚举值到枚举字符串的映射,而将枚举类型作为模板参数的模板函数,则可以直接为每种枚举提供了一个映射容器。

关键代码

templatestring EnumHelper(T key, const std::function processor = nullptr, const char* pszName = NULL){    static_assert(std::is_enum_v, __FUNCTION__ "'s key need a enum");    static map s_mapName;    if (nullptr != pszName)    {        s_mapName[key] = pszName;    }    std::string res = "";    auto it = s_mapName.find(key);    if (it != s_mapName.end())        res = it->second;    if (nullptr != processor)        std::transform(res.begin(), res.end(), res.begin(), processor);    return res;}template size_t analystEnum(T enumClass, const char* pszNames)    static_assert(std::is_enum_v, __FUNCTION__ "'s enumClass need a enum");    cout << "analystEnum: " << pszNames << endl;    if (nullptr != pszNames)        const vector& vecName = split(pszNames, ",");        for (int i = 0; i < vecName.size(); ++i)        {            if (vecName.at(i).size() > 0)            {                EnumHelper((T)(i + 1), nullptr, vecName.at(i).c_str() + (i == 0 ? 0 : 1) );            }        }        return rand();    return rand();#define ENUM_DEFINE(type, ...) enum class type { placeholder, __VA_ARGS__ }; static const size_t g_uEnumSizeOf##type = analystEnum(type::placeholder, #__VA_ARGS__);

以上是"如何解决c++11实现枚举值到枚举名的转换问题"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

函数 变量 代码 文件 参数 模板 问题 关键 内容 多个 字符 字符串 等价 篇文章 静态 可变 不同 价值 全局 兴趣 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 苏州c语言软件开发大概要多少钱 在北京做软件开发工资待遇 软件开发UML建模 软件开发待遇大概多少 如何黑进网站服务器 深圳汇商联盟互联网科技公司 成都慕义互联网科技离职率高吗 胖子吐槽暗黑3登不上服务器 excel服务器打不开 软件开发入公司会干什么 定向培养网络安全工程师 广东银联网络技术服务单价 安卓app手机软件开发 博山企业软件开发服务 2021怒炉服务器人口 自学软件开发有哪些学科 计算机网络技术对什么要求高 信息建设投入网络安全占比 三调数据库田坎面积怎么算 数据库日志满了怎么清空 属于数据库管理系统软件 小型科技互联网靠谱吗 租方舟服务器管理员 无机晶体学数据库在哪里 派出所网络安全事故应急预案 江苏高校党建软件开发系统 关系数据库sql怎么买 安天网络安全山西分公司 网络安全观测报告 医共体数据库系统
0