假设我的代码是这样的:

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:诸如using declaration with enum?之类的其他问题处理的情况是枚举在类中而不是直接在 namespace 中。

最佳答案

这种方式需要在foo namespace 中进行少量工作。但是它对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值包含在 namespace foo中-仅在其中添加/修改/删除此枚举值。我相信这是更安全的。与其他答案相比,它的缺点是您必须修改其他文件,而这不是一个选择。

关于c++ - 在类中映射命名空间的枚举,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12446437/

10-17 02:10