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

3

这些论坛上有几个关于继承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”之前被包含,而其他更大的部分将在其之后被包含。这样可以吗?或者我需要放弃使用枚举,转而使用抽象类?

1
编译器应该如何为some_func生成代码呢?要么X::a是一个在编译时确定的常量,这种情况下编译器需要看到实际的值,通过某种方式获取它。要么它是一个占用空间的变量,这种情况下编译器会生成加载该空间中值的代码。你可以通过将X定义为一个实际的类,并将a定义为其静态成员来实现后者。 - Igor Tandetnik
静态函数不能是虚函数,对吧? - Grief
1
不,它们不能。虽然我很难看出这个事实与手头的问题有什么关联。 - Igor Tandetnik
1个回答

2

将一个带有名义值的enum暴露出来(从0开始,顺序递增)。在库内部,将这些值重新映射到一个具有实现相关值的内部enum中(例如使用数组以提高速度,使用外部值作为索引)。如果将这些enum值导出到外部,则需要反向映射(反向映射会较慢)。


这不是编译时,对吧? - Grief
不要悲伤。您希望一个编译单元具有一组值,而另一个编译单元具有不同的值。在编译时,外部编译单元不能依赖于内部编译单元中的值以实现您想要的功能。因此,为了实现您的要求,在运行时,您需要将外部值映射到内部值。 - Yakk - Adam Nevraumont

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接