2015-12-10 64 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

谢谢你的样品!我明白这是一种糟糕的方式。但是我没有其他的价值,只能从这个枚举中获得。 –