//c++03
enum Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT];
//c++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[(int) Something::SCOUNT];
如何在這種情況下使用枚舉而不將枚舉枚舉數轉換爲int?C++ 11 vs C++ - 枚舉差異
//c++03
enum Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT];
//c++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[(int) Something::SCOUNT];
如何在這種情況下使用枚舉而不將枚舉枚舉數轉換爲int?C++ 11 vs C++ - 枚舉差異
如何使用枚舉在這種情況下沒有鑄造枚舉爲int的數量?*
你不能...但是你可以刪除class
從enum class
的class
關鍵字意味着您不能在該enum
和int
之間隱式轉換刪除class
關鍵字意味着您的enum
將以與以前版本的C++相同的方式工作。您不需要演員,但是通過允許隱式轉換爲整數值,您可以放棄strongly typed enums
的安全性。
//C++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT]; // ERRROR
//C++11
enum Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[SCOUNT]; // OK
你可以閱讀更多關於strongly typed enums
here
C-style cast
並使用
static_cast<>
來代替,因爲這具有更好的類型安全性並且更加明確。
//C++11
enum class Something
{
S1 = 0,
S2,
SCOUNT
};
int arr[static_cast<size_t> (SCOUNT) ]; // OK
實際上在第二種情況下,你不能在沒有投射的情況下寫。
既然你已經使用CAST,你現在可以做的是使用更好投,而不是C風格的轉換:
int arr[to_integral(Something::SCOUNT)];
其中to_integral
被定義爲:
#include <type_traits> //it is where std::underlying_type is defined
template<typename E>
constexpr auto to_integral(E e) -> typename std::underlying_type<E>::type
{
return static_cast<typename std::underlying_type<E>::type>(e);
}
現在這個函數模板是可重用的。您可以使用任何C++ 11樣式枚舉類型。它還推導出基礎類型,所以您不必在代碼中提及。有關詳細說明,請參閱this answer。
第一個版本繼續在C++ 11中工作,但我想你想獲得實際的枚舉成員的好處,只想獲得枚舉成員的數量的方法? – delnan
「enum類」的好處是你不能混合不同枚舉的值嗎? – Appleshell