在C++11中分离枚举声明和定义

Separate enum declaration and definition in C++11

本文关键字:声明 定义 枚举 分离 C++11      更新时间:2023-10-16

这些论坛上有几个关于继承C++枚举进行扩展的问题(这实际上是没有逻辑的事情)。但是,仅仅用于设置特定值的继承呢?目前,在我的代码中有如下内容:

//lib_impl.h
enum class X {
    a = 13, // these values are
    b = 42  // implementation dependent
}
//lib.h
#include "lib_impl.h"
void some_func(X param) {
    X x = X::a;
}

我只是想避免"lib"在实现中的依赖性。可能,必须使用枚举以外的其他方法。即使在C++11中,我们也只能声明正向枚举名称,而不能声明其枚举器:

//lib.h
enum class X { a, b } // this is both declaration and definition, unfortunately
void some_func(X param) {
    X x = X::a;
}
//lib_impl.h
#include "lib.h"
enum class X { // redefenition, compilation error
    a = 13,
    b = 42 
}

对于此类问题,最佳的编译时解决方案是什么?

--

由于它在c++中似乎无法实现,解决此类问题的最常见方法是什么?保持"lib"与"impl"的依赖关系不变?可能,"impl"可以分为两个部分,小的部分将包含在"lib.h"之前,另一个大的部分将包括在它之后。这可以吗?还是我需要放弃使用枚举,而使用抽象类

显示具有标称值的enum(从0开始,按顺序)。在库中,将这些值重新映射到具有实现相关值的内部enum(例如,使用外部值作为索引的速度数组)。如果将所述enum值导出到外部,则反转映射(反转映射会较慢)。