在C ++ 11中单独的枚举声明和定义

时间:2013-11-24 18:23:01

标签: c++ inheritance c++11 enums

这些论坛上有几个关于用于扩展的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 个答案:

答案 0 :(得分:2)

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