Dav*_*tti 5 c++ enums c++11 c++98
我在"Foo"类(下面)中定义了一组枚举值.
namespace Fii
{
class Foo
{
struct Bar
{
enum Baz
{
BAZ1,
BAZ2,
BAZ3
};
};
};
};
Run Code Online (Sandbox Code Playgroud)
我使用结构来减少Baz枚举值的范围,并显示有一组相关的值.
我的目标是将枚举类型的值赋给变量.使用上面的类定义,可以这样做:
Fii::Foo::Bar::Baz myValue = Fii::Foo::Bar::BAZ1 (Works in both C++98 and C++11)
Run Code Online (Sandbox Code Playgroud)
但是,我觉得:
为了提高准备程度,我将代码重新考虑为:
namespace Fii
{
class Foo
{
enum Baz
{
BAZ1,
BAZ2,
BAZ3
};
};
};
Run Code Online (Sandbox Code Playgroud)
使用这个新的类定义,可以这样做:
Fii::Foo::Baz myValue = Fii::Foo::Baz::BAZ1 (Works in C++11 only)
Fii::Foo::Baz myValue = Fii::Foo::BAZ1 (Should work on C++98 and C++11 - not tested)
Run Code Online (Sandbox Code Playgroud)
Q1)为什么Fii :: Foo :: Bar :: Baz myValue = Fii :: Foo :: Baz :: BAZ1仅适用于C++ 11?
Q2)在C++ 98中,有没有办法写Fii :: Foo :: Baz myValue = Fii :: Foo :: Baz :: BAZ1?您可以在类定义中进行任何您喜欢的更改.
环境: - 支持C++ 11的Clang编译器 - Xcode 4 - Mac OS OS 10.8
C++ 11添加了类枚举.它还添加了一种访问旧式枚举值的新方法,这是您在这里看到的.
enum Foo { FOO1, FOO2, FOO3 }; // old-style enum
Foo f1 = Foo::FOO1; // OK in C++11, error in C++98.
Foo f2 = FOO1; // OK in C++98 and C++11 (for backward compatibility)
Run Code Online (Sandbox Code Playgroud)
juanchopanza的答案对Q1有效......
Q2:在C++ 98中,有没有办法写Fii :: Foo :: Baz myValue = Fii :: Foo :: Baz :: BAZ1?您可以在类定义中进行任何您喜欢的更改.
就像是:
namespace Fii
{
class Foo
{
class Baz
{
public:
enum E { BAZ1, BAZ2, BAZ3 };
Baz(E e) : e_(e) { }
operator const E() const { return e_; }
private:
E e_;
};
};
}
Run Code Online (Sandbox Code Playgroud)
说明:Fii::Foo::Baz::BAZ1要成为C++ 03中枚举的有效引用,Baz 必须是a namespace或class/ struct/ union.但是,我们试图使Baz本身看起来好像是枚举类型,BAZ1就是其中一个可用的值.为此,我们必须使Baz成为用户定义类型(类/结构),能够存储在其范围内声明的任何枚举.因此,我们添加一个数据成员来记录当前值,一个构造函数来设置值,一个运算符隐式地公开枚举值,这样你就不需要e_使用Baz对象编写对代码中任何地方的显式引用或者调用一些get() const功能.