c++14 获取枚举名
c++14 获取枚举名
前言
之前写过一篇c++11 获取枚举名,这里使用c++14 进行重构。c++14 放松了对 constexpr
函数的限制,因此可以将解析枚举名的步骤移至编译期进行,从而也避免了通过在头文件定义并初始化变量来获得代码执行权的“骚操作”。
相较c++11 版本,本篇介绍的实现方案主要有如下优点:
- 不再需要在头文件定义并初始化变量。
- 解析枚举名的步骤移至编译期进行,运行期间获取枚举名基本无额外开销。
- 相比上一版本,还缩小了代码体积,可从编译产生的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" }
,之后将结果保存在一个全局位置即可。