【问题标题】:Separate enum declaration and definition in C++11在 C++11 中单独的枚举声明和定义
【发布时间】:2013-11-24 18:23:00
【问题描述】:

在这些论坛上有几个关于 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 设为它的静态成员。
  • 静态函数不能是虚函数,可以吗?
  • 不,他们不可能。虽然我很难看出这一事实与手头问题的相关性。

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


【解决方案1】:

公开一个带有标称值的enum(从 0 开始,顺序表示)。在您的库中,将这些值重新映射到内部 enum 与实现相关的值(例如速度数组,使用外部值作为索引)。如果将上述enum 值导出到外部,则反向映射(反向映射会更慢)。

【讨论】:

  • 这不是编译时的,不是吗?
  • @Grief 没有。您希望一个编译单元具有一组值,而另一个编译单元具有不同的值。在编译时,外部编译单元不能依赖内部编译单元中的值来执行您想要的操作。因此,按照您的要求,在运行时,您将外部值映射到内部值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 2014-08-22
  • 2010-09-09
相关资源
最近更新 更多