5

我在“Foo”类(下)中定义了一组枚举值。

namespace Fii
{
    class Foo 
    {
        struct Bar
        {
            enum Baz
            {
                BAZ1,
                BAZ2, 
                BAZ3
            };
        };
    };
};

我正在使用结构来缩小 Baz 枚举值的范围,并显示有一组相关值。

我的目标是将枚举类型中的值分配给变量。使用上面的类定义,可以做到这一点:

Fii::Foo::Bar::Baz myValue = Fii::Foo::Bar::BAZ1 (Works in both C++98 and C++11)

但是,我觉得:

  • 乍一看,myValue似乎被初始化为Fii::Foo::Bar但这只是因为 enum 是在父级中对相关常量进行分组的黑客(本例中为Bar

为了提高准备,II 将代码重构为:

namespace Fii
{
    class Foo 
    {
        enum Baz
        {
            BAZ1,
            BAZ2, 
            BAZ3
        };
    };
};

使用这个新的类定义,可以做到这一点:

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)

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

4

2 回答 2

7

C++11 添加了类 enums。它还添加了一种访问旧式枚举值的新方法,这就是您在此处看到的。

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)
于 2012-09-12T05:49:10.643 回答
6

juanchopanza 的答案对第一季度有效......

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_;
        };
    };
}

说明:Fii::Foo::Baz::BAZ1要成为对 C++03 中枚举的有效引用,Baz 必须是 anamespaceclass/ struct/ union。但是,我们试图让它看起来好像 Baz 本身就是枚举类型,而 BAZ1 是可用值之一。为此,我们必须使 Baz 成为能够存储在其范围内声明的任何枚举的用户定义类型(类/结构)。因此,我们添加了一个数据成员来记录当前值,一个构造函数来设置值,一个运算符来隐式公开枚举值,这样您就不需要e_使用Baz对象在代码中对任何地方进行显式引用或调用一些get() const功能。

于 2012-09-12T06:09:44.207 回答