2012-11-03 183 views
2

我枚舉類,說擴展枚舉類

enum class Enum{ 
    var1, var2; 
} 

現在我想添加一些部件,其取決於參數即var3(int)。好的,這不是枚舉,所以我想通過普通的類更改它,但我的目標是將舊代碼(Enum::var1作爲Enum類型的值)編譯。

我試圖做這種方式(讓我們暫時忘記了var3,這將是靜態函數):

class Enum{ 
    public: 
     const static Enum var1 = Enum(1); 
     const static Enum var2 = Enum(2); 
    private: 
     Enum(int v):v(v){ 
     } 
    int v; 
    //operator == using v 
}; 

但是,這並不編譯,因爲枚舉具有不完整的類型。
我不能在課後聲明它,因爲它在標題中,所以它不適用於多個cpp。此外,在這裏建立公共構造函數並不是個好主意。

有什麼想法?

+2

這樣做的最大的問題是你不能使用'枚舉:: VAR1 '需要一個常量表達式。 – Xeo

+0

@ Xeo1:將constexpr修復它?順便說一句,不需要使用constexpr(現在,也許) – RiaD

+1

不,因爲類類型不能用作非類型模板參數。 – Xeo

回答

1

解決方案1:

對於靜態變量的問題:在類聲明中聲明你的靜態變量:

class Enum 
{ 
    public: 
     static const Enum var1; 
     static const Enum var2; 
     Enum(int v):v(v) 
     { 
     } 
    private: 
     int v; 
     //operator == using v 
}; 

然後,創建這個類,Enum.cpp源文件,其中包含:

#include "Enum.h" 
const Enum Enum::var1 = Enum(1); 
const Enum Enum::var2 = Enum(2); 

解決方案2:

如果你希望它是僅標頭,你可以使用靜態變量而不是類變量:

class Enum 
{ 
    public: 
     Enum(int v):v(v) 
     { 
     } 
    private: 
     int v; 
}; 

namespace Enumeration // It is not possible to name it 'Enum' 
{ 
    // static => local to translation unit. No linking conflict 
    static const Enum var1 = Enum(1); 
    static const Enum var2 = Enum(2); 
} 

你可以看到a live example here。唯一的缺點是你不能使用名稱空間的類名。

+0

這很酷,但我想使它無效,因爲我需要爲最終用戶提供ONLY標頭 – RiaD

+0

如果需要常量表達式,將無法使用它們。 – Xeo

+0

順便說一句,不與私人ctor編譯。修復它在你的代碼中。 – RiaD

0

你可以寫這樣的一類:

class Enum 
{ 
public 
    enum NestedEnum : int 
    { 
     var1, var2 
    }; 

    static NestedEnum var3; 

    Enum(NestedEnum value) : value(value) { } 

    operator NestedEnum() const { return value; } 
private: 
    NestedEnum value; 
}; 

及任何你可以聲明:

Enum::var3 = (Enum::NestedEnum)someIntegerVariable;