2017-06-18 146 views
5

我可以定義一個類型作爲枚舉的基礎類型嗎?類似這樣的:自定義枚舉基礎類型

struct S { 
    S(int i) : value(i) {} 
    operator int() { return value; } 

    int value; 
}; 

enum E : S { 
    A, B, C 
}; 

錯誤消息告訴我S必須是一個整數類型。我試圖像下面這樣專門研究std::is_integral,但似乎在這種情況下,「整型」實際上意味着其中一種基本類型。

namespace std { 
    template<> 
    struct is_integral<S> : public true_type {}; 
} 

因此,使用任何版本的C++,有沒有辦法讓一個自定義類型作爲一個整型傳遞?

回答

2

我可以定義一個類型作爲枚舉的基礎類型嗎?

您只能使用整數類型來定義enum s,而不是任何舊類型。

例如,你可以使用

enum E : char { 
    A, B, C 
}; 

指示的E值將是char類型。但你不能使用

enum E : S { 
    A, B, C 
}; 

C++11 Standard, 3.9.1/7

類型boolcharchar16_tchar32_twchar_t和符號和無符號整數類型統稱爲整數類型。整數類型的同義詞是整數類型。

+0

因此,在這種情況下的「整數類型」與「的std :: is_integral'? – Nelfeal

+0

您發佈的示例將顛覆「std :: is_integral」的意圖。我不確定在語言中是否有任何東西來阻止這種情況發生。 –

+3

[看起來像''中的任何東西都是未定義的行爲。](https://stackoverflow.com/questions/8513417/what-c​​an-and-cant-i-specialize-in-the-std-namespace)。我應該看得更徹底。另外[this](https://stackoverflow.com/questions/25345486/why-specializing-a-type-trait-could-result-in-undefined-behaviour)(感謝HolyBlackCat)。 – Nelfeal

2

的std :: is_integral 檢查T是否爲一個整數類型。提供構件的恆定值,它等於真,如果T是bool類型,charchar16_tchar32_twchar_tshortintlonglong long,或任何實現所定義的擴展整型,包括任何符號,無符號,和符合cv標準的變體。否則,值等於假。

這是摘自here。 這意味着enum必須是使用以下類型之一:

boolcharchar16_tchar32_twchar_tshortintlonglong long

+0

[這並不意味着你不能專注'is_integral'](http://coliru.stacked-crooked.com/a/b9828b8eaf4d59e3) – Nelfeal

+0

我不相信我寫的任何違背。 – Shiro

+0

@Nelxiost你有它向後。 'std :: is_integral'指示一個類型是否是整數,由標準和實現定義。專注於std ::'的東西是(通常)UB – Caleth