在类中映射命名空间枚举

时间:2012-09-16 11:20:03

标签: c++ enums namespaces

假设我的代码如下:

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?这样的其他问题处理枚举在一个类中而不是直接在命名空间中的情况。

2 个答案:

答案 0 :(得分: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中 - 只有你添加/修改/删除这个枚举值。我相信这更安全。与其他答案相比,它的缺点是你必须修改其他无法选择的文件。

答案 1 :(得分: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; }
};

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