C++11 枚举前置声明

C++11 枚举前置声明

引入

在 C++ 的头文件中,适当使用类前置声明,可以减少头文件依赖,降低循环依赖问题发生概率;对于枚举类型,同样希望像类类型一样进行前置声明以减少依赖,而这在 C++11 之前是非法的,例如下述示例代码是不能通过编译的;

class CTest;   // 合法
enum ETest;    // 非法

另外,C++11 之前的纯枚举类型可能会引起命名冲突问题以及类型隐式转换问题,因此需要一个增强型的枚举类型来解决这些问题;

使用

C++11 引入了强枚举类型以解决上述问题,尤其是可以像类类型一样进行前置声明而不用引用头文件;其使用方法如下述示例代码:

// C++11 枚举前置声明使用方法:无需引用枚举头文件
enum ETest1 : int;                // 纯枚举具体类型不定,故需指定类型以明确内存大小
enum class ECTest2;               // 强枚举类型默认类型为 "int",故可不指定具体类型
enum class ECTest3 : unsigned;    // 强枚举类型亦可指定其他具体类型

void funTest1(const ETest1 e1);
void funTest2(const ECTest2 e2);
void funTest3(const ECTest3 e3);

题外

在工程开发中,枚举类型除了有前置声明的需求外,常常还需要枚举-字符串转换等操作(这属于反射性质),但是 C++11 的强枚举并不提供此操作;幸运的是,开源库 magic_enum 提供了包含上述操作的一系列常用功能,若开发环境编译器支持 C++17,可至其官方链接了解并尝试使用;

参考

C++枚举

Neargye/magic_enum


本文作者: 王同学