2015-12-10 97 views
2

我可以通過我的int變量值獲得枚舉類變體嗎?現在,我有這樣的枚舉類:C++ 11如何通過int值獲取枚舉類的值?

enum class Action: unsigned int { 
REQUEST, 
RETURN, 
ISSUANCE 
}; 

而且我需要從數據庫值(數據庫返回無符號整數)獲取此值。如何優化使其成爲可能?現在,只是我爲每個變體使用開關,但這是一種愚蠢的行爲。請解釋我!

+1

看看'static_cast'。順便說一句,在C++中使用所有大寫標識符是*不是一個好主意。他們可能會因宏名稱而崩潰。 –

+0

感謝您的諮詢!我只開始學習C++。請寫下更多關於它的信息,我不確定是否瞭解你。 –

回答

3

你甚至可以寫,應該是能夠任意枚舉類轉換爲它的基本類型(C++ 14)的通用轉換功能:

template<typename E> 
constexpr auto toUnderlyingType(E e) 
{ 
    return static_cast<typename std::underlying_type<E>::type>(e); 
} 

用C++ 11

template<typename E> 
constexpr auto toUnderlyingType(E e) -> typename td::underlying_type<E>::type 
{ 
    return static_cast<typename std::underlying_type<E>::type>(e); 
} 
+0

非常感謝!這對我很有幫助。但如何才能捕獲類型轉換的錯誤? –

+0

請問,你能解釋一下這部分代碼是如何使''typename td :: underlying_type :: type'? –

+0

請解釋我如何使用這個功能。現在,我嘗試這樣做:'Action a = toUnderlyingType(my_unsigned_int_var);' –

2

我很喜歡這個開關,因爲這意味着你可以添加一條default: assert(!"Bad value in database");行。另一方面:

unsigned int ui = ... ; 
auto action = static_cast<Action>(ui); 

也可以工作。

+0

謝謝你的樣品!我明白這是一種糟糕的方式。但是我沒有其他的價值,只能從這個枚舉中獲得。 –