这些论坛上有几个关于用于扩展的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'之前,另一个,更大,将包括在它之后。它是好的还是我需要放弃使用枚举来支持抽象类?
答案 0 :(得分:2)
使用名义值公开enum
(从0开始,顺序说)。在库中,将这些值重新映射到具有实现相关值的内部enum
(例如,使用外部值作为索引的速度数组)。如果将所述enum
值导出到外部,则反转映射(反向映射将更慢)。