2013-08-28 160 views
3
//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++ - 枚舉差異

+1

第一個版本繼續在C++ 11中工作,但我想你想獲得實際的枚舉成員的好處,只想獲得枚舉成員的數量的方法? – delnan

+0

「enum類」的好處是你不能混合不同枚舉的值嗎? – Appleshell

回答

10

如何使用枚舉在這種情況下沒有鑄造枚舉爲int的數量?*

你不能...但是你可以刪除classenum class

class關鍵字意味着您不能在該enumint之間隱式轉換刪除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 enumshere


另一種選擇是投它,就像你在做什麼。但是您應該避免使用舊的 C-style cast並使用 static_cast<>來代替,因爲這具有更好的類型安全性並且更加明確。

//C++11 
enum class Something 
{ 
    S1 = 0, 
    S2, 
    SCOUNT 
}; 
int arr[static_cast<size_t> (SCOUNT) ]; // OK 
5

實際上在第二種情況下,你不能在沒有投射的情況下寫。

既然你已經使用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