C++11 C++;11如何通过int值获取枚举类值?

C++11 C++;11如何通过int值获取枚举类值?,c++11,enums,C++11,Enums,我可以通过int变量值获取枚举类变量吗?现在,我有了这么一个枚举类: enum class Action: unsigned int { REQUEST, RETURN, ISSUANCE }; 我需要从数据库值中获取这个值(数据库返回unsigned int)。如何制作它?现在,我只对每个变体使用开关,但这是一个愚蠢的行为。请给我解释一下 我非常喜欢这个开关,因为它意味着您可以添加一个default:assert(!“数据库中的坏值”)行。另一方面: unsigned int ui = ..

我可以通过int变量值获取枚举类变量吗?现在,我有了这么一个枚举类:

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

我需要从数据库值中获取这个值(数据库返回unsigned int)。如何制作它?现在,我只对每个变体使用开关,但这是一个愚蠢的行为。请给我解释一下

我非常喜欢这个开关,因为它意味着您可以添加一个
default:assert(!“数据库中的坏值”)行。另一方面:

unsigned int ui = ... ;
auto action = static_cast<Action>(ui);
unsigned int ui=;
自动动作=静态施法(ui);

也可以使用。

您甚至可以编写一个通用转换函数,该函数应该能够将任何枚举类转换为其基础类型(C++14):

模板
constexpr自动toUnderlyingType(E)
{
返回静态_-cast(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);
}
模板
constexpr auto-toUnderlyingType(E)->typename td::底层类型::类型
{
返回静态_-cast(e);
}

签出
静态播放
。顺便说一下,在C++中使用所有大写标识符不是一个好主意。它们可能会因宏名称而崩溃。谢谢您的建议!我只开始学习C++。请多写一些,我不确定你是否理解。谢谢你的样品!我明白这是一种不好的方式。但是我没有其他的价值,只有这个枚举。非常感谢!这对我真的很有帮助。但是我怎样才能捕捉类型转换的错误呢?请,你能解释一下这部分代码是如何生成的
->typename td::undernative_type::type
?请解释一下如何使用这个函数。现在,我尝试这样做:
Action a=toUnderlyingType(我的unsigned int变量)它被称为尾随返回类型,请参见这些是否将枚举数(命名值)转换为适当的原始整数?我读了OP,想要相反的结果。在这种情况下,马丁·邦纳的回答更好地解决了这个问题。
template<typename E>
constexpr auto toUnderlyingType(E e) -> typename td::underlying_type<E>::type 
{
   return static_cast<typename std::underlying_type<E>::type>(e);
}