1

假设我有这样的代码:

namespace foo {
  enum bar
  {
    fooBarA,
    fooBarB
  };
}

struct baz
{
  // TODO: map "bar" in this struct to make valid:
  bar returnSomething() { return fooBarA; }
};

// and also this:
void doSomething()
{
  baz myBaz;

  if( baz::fooBarA == myBaz.returnSomething() )
  { /* ... */ }
}

我可以在 TODO 部分放置什么样的代码以使其余部分有效?一些usingtypedef

PS:为了避免关于“为什么”的问题:命名空间存在于它自己的头文件中,并且可能被几个不同的类使用,这些类应该就值达成一致,fooBarAfooBarB也隐藏它们所基于的,foo因为这与伙计们使用baz.

PPS:允许使用 C++11。会有enum class帮助吗?

PPPS:其他问题,例如使用枚举声明?处理枚举在类中而不是直接在命名空间中的情况。

4

2 回答 2

1

这种方式需要在 foo 命名空间中进行少量工作。但它对 foo::bar 的现有用户应该是透明的。只需将您的 foo::bar 的值包含在一些从中派生出您的 baz 类的结构中:

namespace foo {
  struct barValues
  {
    enum Values {
      fooBarA,
      fooBarB
   };
  };

  typedef barValues::Values bar;
  static const bar fooBarA = barValues::fooBarA;
  static const bar fooBarB = barValues::fooBarB;
}

struct baz : foo::barValues
{
  typedef foo::bar bar;
  bar returnSomething() { return fooBarA; }
};

// and also this:
void doSomething()
{
  baz myBaz;

  if( baz::fooBarA == myBaz.returnSomething() )
  { /* ... */ }
  if( foo::fooBarA == myBaz.returnSomething() )
  { /* ... */ }
}

与其他答案相比,它的优势在于您将 foo::bar 值包含在命名空间 foo 中 - 只有在那里您才能添加/修改/删除此枚举值。我相信这更安全。与其他答案相比,它的缺点是您必须修改其他不能选择的文件。

于 2012-09-16T12:45:40.383 回答
0

这会起作用

struct baz
{
    typedef foo::bar   bar;
    static const bar fooBarA = foo::fooBarA;
    static const bar fooBarB = foo::fooBarB;

  // This is now valid
  bar returnSomething() { return fooBarA; }
};

但我不知道它是否真的有用。如果您的用户试图重载某些功能或其他东西,他们可能会感到惊讶。

于 2012-09-16T12:00:43.393 回答