这些论坛上有几个关于继承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”之前被包含,而其他更大的部分将在其之后被包含。这样可以吗?或者我需要放弃使用枚举,转而使用抽象类?
some_func
生成代码呢?要么X::a
是一个在编译时确定的常量,这种情况下编译器需要看到实际的值,通过某种方式获取它。要么它是一个占用空间的变量,这种情况下编译器会生成加载该空间中值的代码。你可以通过将X
定义为一个实际的类,并将a
定义为其静态成员来实现后者。 - Igor Tandetnik