c++14 获取枚举名

c++14 获取枚举名

前言

之前写过一篇c++11 获取枚举名,这里使用c++14 进行重构。c++14 放松了对 constexpr 函数的限制,因此可以将解析枚举名的步骤移至编译期进行,从而也避免了通过在头文件定义并初始化变量来获得代码执行权的“骚操作”。
相较c++11 版本,本篇介绍的实现方案主要有如下优点:

  1. 不再需要在头文件定义并初始化变量。
  2. 解析枚举名的步骤移至编译期进行,运行期间获取枚举名基本无额外开销。
  3. 相比上一版本,还缩小了代码体积,可从编译产生的lib 大小看出。(c++11 lib大小增加主要原因是在头文件定义并初始化变量导致,不过也可以进行优化,将初始化变量调用的模板函数改为普通函数即可,不过代码复杂度也相应提高了。)

关键技术

constexpr 函数

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

XXX(Color, Red, Blue)"Red, Blue",现在我们不希望在运行期才去解析每个Color 值对应的名字,我们希望在编译期直接获得一个字符串数组,之后运行期直接根据枚举值到对应下标位置获取字符串。

const char* NAMES[] = { "Red", "Blue" }; 
NAMES[ int(Color::Red) ] -> "Red"

constexpr 函数就提供了这样的解决途径,我们可以实现一个编译期即可运行的字符串分割函数,传入 "Red, Blue" 传出 { "Red", "Blue" },之后将结果保存在一个全局位置即可。

源码地址

posted @ 2022-03-26 16:37  hchlqlz  阅读(1616)  评论(0编辑  收藏  举报