访问C++ 98和C++ 11中的枚举值

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)

但是,我觉得:

  • 乍一看,myValue似乎被初始化为Fii :: Foo :: Bar,但这只是因为枚举是一个hack来对父节点中的相关常量进行分组(在这种情况下为Bar)

为了提高准备程度,我将代码重新考虑为:

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

jua*_*nza 6

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)


Ton*_*roy 5

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 namespaceclass/ struct/ union.但是,我们试图使Baz本身看起来好像是枚举类型,BAZ1就是其中一个可用的值.为此,我们必须使Baz成为用户定义类型(类/结构),能够存储在其范围内声明的任何枚举.因此,我们添加一个数据成员来记录当前值,一个构造函数来设置值,一个运算符隐式地公开枚举值,这样你就不需要e_使用Baz对象编写对代码中任何地方的显式引用或者调用一些get() const功能.