效果

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

关键技术

  1. __VA_ARGS__

    __VA_ARGS__ 实现了可变参数的宏。

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

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

    enum class Color
    {
    Red,
    Blue
    };
  2. #__VA_ARGS__

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

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

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

  3. 在函数外执行代码的能力

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

    const int temp = initialize();

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

  4. 模板函数的静态变量

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

  5. 关键代码

    template<typename T>
    string EnumHelper(T key, const std::function<char(char)> processor = nullptr, const char* pszName = NULL)
    {
    static_assert(std::is_enum_v<T>, __FUNCTION__ "'s key need a enum"); static map<T, string> 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 <class T>
    size_t analystEnum(T enumClass, const char* pszNames)
    {
    static_assert(std::is_enum_v<T>, __FUNCTION__ "'s enumClass need a enum"); cout << "analystEnum: " << pszNames << endl; if (nullptr != pszNames)
    {
    const vector<string>& 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__);
  6. 源码地址

c++11 实现枚举值到枚举名的转换的更多相关文章

  1. Kendo Grid控件中将枚举值转为枚举名显示

    我们在开发过程中经常会遇到需要将枚举值转换成名称进行显示的情况.如下我们有这样一个数据源对象: var users = [ {id: 1, name: "similar1", st ...

  2. Day 12:枚举值、枚举类

    jdk1.5新特性之-----枚举 问题:某些方法所接收的数据必须是在固定范围之内的,  解决方案: 这时候我们的解决方案就是自定义一个类,然后是私有化构造函数,在自定义类中创建本类的对象对外使用. ...

  3. C语言基础 (11) 结构体 ,共用体 枚举 typedef

    1 课堂回顾 作用域与生命周期 2 static 局部变量 2 打字游戏 3 内存分区代码分析 4 结构体基本操作 (复合类型[自定义类型 #include <stdio.h> #incl ...

  4. .NET陷阱之六:从枚举值持久化带来大量空间消耗谈起

    好长时间没有写博文了,今天继续. 这次跟大家分享的内容起因于对一个枚举值列表的序列化,下面简化后的代码即能重现.为了明确起见,我显式指定了枚举的基础类型. // 定义一个枚举类型. public en ...

  5. 第三章 EnumUtil根据值获取枚举对象

    项目中使用枚举类的好处这里不再赘述,在使用枚举值时,通常需要根据值来获取枚举对象,下面介绍两种实现方案: 1.在枚举类中定义方法实现 首先给出如下性别枚举类: public enum SexEnum ...

  6. 利用DescriptionAttribute定义枚举值的描述信息 z

    System.ComponentModel命名空间下有个名为DescriptionAttribute的类用于指定属性或事件的说明,我所调用的枚举值描述信息就是DescriptionAttribute类 ...

  7. C# 枚举值 (二) 多属性 操作

    很多时候,我们的枚举值可能需要中英文, 那么可以使用下面的方法: 下面这个类,包含2部分. 1 BaseDescriptionAttribute特性的重载 2 枚举的操作类 EnumOperate n ...

  8. c++之enum(枚举)可以没有枚举名

    转载自https://blog.csdn.net/u013591613/article/details/71215000 C_enum(枚举)可以没有枚举名 如果声明枚举类型时没有指定枚举名,其作用就 ...

  9. Enum 枚举值 (一) 获取描述信息

    封装了方法: public static class EnumOperate { public class BaseDescriptionAttribute : DescriptionAttribut ...

随机推荐

  1. 如果遇到继承控件,添加到新项目里在工具栏找不到的情况下,F5启动一下,重新生成是不会有的,要运行成功才有

    继承控件只的是cs结尾的那种,类直接继承对应控件,不是usercontrol类型的

  2. Docker版本Jenkins的使用

    一. 什么是Jenkins Jenkins是当前非常流行的一款持续集成工具,可以帮助大家把更新后的代码自动部署到服务器上运行. 二. 为什么用docker版的Jenkins Jenkins主要有三种安 ...

  3. Java程序性能监控工具

    系统性能监控: 确定系统运行的整体状态,基本定位问题所在 uptime命令 [root@localhost ~]# uptime23:19:38 up 244 days, 3:39, 34 users ...

  4. 网管必须必须知道的知识!ARP攻击与欺骗的原理!

    ARP攻击与ARP欺骗原理及应用 1.ARP概述以及攻击原理 2.ARP欺骗原理 3.ARP故障处理 1.什么是ARP协议?将一个已知的IP地址解析成MAC地址.无论是ARP攻击还是ARP欺骗,它们都 ...

  5. SQL注入的原理及一般步骤

    原理 SQL注入是一种攻击方式,在这种攻击方式中,恶意代码被插入到字符串中,然后该字符串传递到SQL Server的实例以进行分析和执行.任何构成SQL语句的过程都应进行注入检查,因为SQL Serv ...

  6. 32、python并发编程之背景知识

    目录: 一 引子 二 为什么要有操作系统 三 什么是操作系统 四 操作系统与普通软件的区别 五 操作系统发展史 六 总结视频链接: 一 引子 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的 ...

  7. 深入MySQL(一):MySQL的组织架构

    今天开始将自己所学过的MySQL的知识都尝试融会贯通,并且用写博客的方式记录分享下来. 今天讲的主题是MySQL的组织架构,对于学习一个中间件或者开源项目而言,我觉得最重要的便是先知晓其组织架构,以一 ...

  8. 解决POI多线程导出时数据错乱问题

    项目里有一个导出功能,但随着数据量大量上涨,导出时间长到不可忍受,遂重写此接口,多线程导出的代码并不复杂,每页有一条线程负责写入,利用线程池去调度,用countdownLatch保证在所有数据写完后再 ...

  9. 转:Minikuberar的含义很不错可以看看

    Kubernetes的主要意图是通过杂乱的负载均衡和资源分配功用跨服务器集群保管使用程序.即使某些服务器呈现毛病,也能够保证使用程序平稳运转.因而在出产布置中,有必要为Kubernetes装备多个服务 ...

  10. RadonDB MySQL on K8s 2.1.2 发布!

    RadonDB MySQL on Kubernetes 于 2 月 17 日发布了新版本 2.1.2 .该版本在节点的重建.增删等方面进行了全面升级. 致谢: 首先感谢 @andyli029 @ace ...