C++11 枚举前置声明
2023-02-13
2 min read
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,可至其官方链接了解并尝试使用;
参考
版权声明:
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!