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として初期化されているように見えますが、これは、列挙型が親(この場合は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コンパイラ-Xcode4-MacOS OS 10.8

4

2 に答える 2

7

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

juanchopanzaの回答は第1四半期に有効です...

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::BAZ1C ++ 03の列挙型への有効な参照であるためには、または//であるBaz 必要があります。ただし、Baz自体が列挙型であり、BAZ1が使用可能な値の1つであるかのように見せようとしています。そのためには、Bazを、そのスコープ内で宣言された任意の列挙型を格納できるユーザー定義型(クラス/構造体)にする必要があります。したがって、現在の値を記録するデータメンバー、値を設定するコンストラクター、列挙値を暗黙的に公開する演算子を追加して、オブジェクトを使用してコード内のすべての場所への明示的な参照をコーディングしたり、いくつかを呼び出したりする必要がないようにします働き。namespaceclassstructunione_Bazget() const

于 2012-09-12T06:09:44.207 に答える