命名空间中的枚举

Sta*_*als 20 c++ enums namespaces c++11

是否有点像这样做:

namespace status{
  enum status{
    ok,
    error
  };
}
Run Code Online (Sandbox Code Playgroud)

并使用它 status::ok

或者我应该这样做:

enum status{
  status_ok,
  status_error
};
Run Code Online (Sandbox Code Playgroud)

并像这样使用它status_ok

更新: 使用C++ 11,您现在应该这样做:

enum class status {
    ok,
    error
};
Run Code Online (Sandbox Code Playgroud)

并使用这样的: status::ok

Fre*_*abe 21

我个人不喜欢第二种变化,因为这status_部分对我来说似乎是多余的.前一个版本避免了这个问题,但是一个类型status::status看起来也很奇怪.此外,命名空间可以修改,所以如果有人做了类似的事情

namespace status {
  void error( const char *msg );
}
Run Code Online (Sandbox Code Playgroud)

由于函数error与您的enum值冲突,您将收到编译器错误.

我更喜欢使用第三种变体:

struct MouseButton {
  enum Value {
    Left, Middle, Right
  };
};
Run Code Online (Sandbox Code Playgroud)

这让我可以编写像

void handleMouseButton( MouseButton::Value b ) {
  switch ( b ) {
    case MouseButton::Left:   // ...
    case MouseButton::Middle: // ...
    case MouseButton::Right:  // ...
  }
}
Run Code Online (Sandbox Code Playgroud)


neo*_*phi 7

在启用C++ 0x扩展时,您刚想要添加到C++中.但是,如果您不能使用C++ 0x功能,我建议这样做:

struct status
{
    enum value
    {
        ok,
        error
    };
};
Run Code Online (Sandbox Code Playgroud)

有这样的声明你可以写:

status::value var = status::ok;
Run Code Online (Sandbox Code Playgroud)

这样的结构还允许您声明与struct范围内的状态类型相关的函数.例如,状态struct可以包含转换为字符串/从字符串转换的方法.