2012-09-12 81 views
5

我在「Foo」類(下面)中定義了一組枚舉值。在C++ 98和C++中訪問枚舉值11

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 ::富::酒吧但是這僅僅是因爲枚舉是一個黑客將相關的常量在父(酒吧在這種情況下)

要提高戰備,二重因素代碼:

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 ::富::酒吧: :Baz myValue = Fii :: Foo :: Baz :: BAZ1只適用於C++ 11?

Q2)在C++ 98,有寫FII ::富::巴茲myvalue的= FII ::富::巴茲:: BAZ1的方法嗎?您可以在班級定義中進行任何您想要的更改。

環境: - 鏘編譯器C++ 11支持 - Xcode的4 - 的Mac OS操作系統10.8

回答

5

juanchopanza的答案的有效期爲Q1 ...

Q2:在C++ 98,有沒有寫FII ::富::巴茲myvalue的= FII的方式::富::巴茲:: 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必須namespaceclass/struct/union。但是,我們試圖讓它看起來好像Baz本身就是枚舉類型,BAZ1是可用值之一。爲此,我們必須使Baz成爲一個用戶定義的類型(一個類/結構),能夠存儲在其範圍內聲明的任何枚舉。因此,我們添加一個數據成員來記錄當前值,一個設置值的構造函數,一個隱式公開枚舉值的運算符,因此您不需要在代碼中使用Baz對象在代碼中的任何地方明確引用e_,或者調用一些get() const函數。

+0

你能解釋爲什麼這段代碼是必需的嗎? Baz(E e):e_(e){} operator const E()const {return e_; } private: E e_; –

+0

@DavidAndreoletti:在上面的代碼中,Baz是一個「用戶定義的類型」 - 一個對象實例每個都管理一個「E」值的類。您要求的代碼是存儲其中一個枚舉的構造方法,只要對象出現在編譯器不知道如何處理「Baz」的表達式中時隱式提供「E」值的運算符,以及成員變量存儲'E'。明白了嗎? - 隨時要求進一步澄清/例子.... –

+0

我試過你的建議,它工作得很好。你認爲這有助於代碼的可讀性並且不會妨礙代碼的可維護性嗎? –

6

C++ 11將class 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)