c++ - 枚举 "copy"问题

标签 c++ decorator enums typedef

我有一个类,我们称它为 A。它有一个枚举 (E) 和一个方法 Foo(E e),在参数中获取 E。我想为 A 编写一个包装器(装饰器)W。因此它将有自己的方法 Foo(A::E)。但我想有某种封装,所以这个方法应该定义为 Foo(F f),其中 F 是 W 中定义的另一个枚举,可以转换为 A::E。例如:

class A
{
  public:
    enum E { ONE, TWO, THREE };
    void Foo(E e);  
};

class B
{
  //enum F; // ???
  void Foo(F f)
  {
    a_.Foo(f);
  }

  private:
    A a_;
};

F应该怎么定义?我不想像这样复制值:

enum F { ONE = A::ONE, TWO = A::TWO, THREE = A::THREE };

因为它是邻近特征的潜在错误。是typedef定义:

typedef A::E F;

是最好的决定吗?合法吗?

最佳答案

typedef 的问题在于它不会让 A 消失。你不能说 F f = B::ONE;,因为 B::ONE 不存在。您仍然必须使用 A::ONE 等。据我了解,这不是您想要的。

就您的目标而言,在 B 中创建一个新的枚举可能是您最好的选择。此处唯一需要注意的是 1) 您需要在 A::E 和 B::F 之间进行类型转换,以及 2) 一个枚举中的更改需要反射(reflect)到另一个枚举中。

不过,没有必要像您那样复制值。如果 A::E 是:

enum E { ONE = 4, TWO = 7, THREE, FOUR, FIVE };

然后您可以复制并粘贴它来创建 B::F:

enum F { ONE = 4, TWO = 7, THREE, FOUR, FIVE };

但是,这种复制和粘贴的缺点是,如果我随后决定将 A::TWO 更改为等于 10,则必须确保更改 B::TWO。如果您按照显示的方式定义 B::F ( ONE = A::ONE ... ),这将不是问题,但工作量会增加一些。

关于c++ - 枚举 "copy"问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2596446/

相关文章:

c++ - 将 `using` 指令限制到当前文件

限制调用次数的 Python 装饰器

python - 使用装饰器更新包装器时遇到错误

C# 向 .net 枚举添加额外值

java - 仅包含静态方法的类 - 是否为枚举

java - 分解出出现在许多枚举中的方法

c++ - 计算数组中位置的巧妙方法 (C++)

c++ - Xcode 错误 : "2 duplicate symbols for architecture x86_64"

c# - 我如何创建一个可以从 c# 调用的 cpp 函数,并将函数作为参数

c# - Autofac Singleton Decorator 构造多次