【问题标题】:C++ 11 How to get enum class value by int value?C++ 11 如何通过 int 值获取枚举类值?
【发布时间】:2015-12-10 10:40:35
【问题描述】:

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

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

我需要从数据库值中获取这个值(数据库返回无符号整数)。如何优化?现在,我只是为每个变体使用 switch,但这是愚蠢的。请解释一下!

【问题讨论】:

  • 查看static_cast。顺便说一句,在 C++ 中使用全部大写的标识符不是一个好主意。它们很可能会因宏名称而崩溃。
  • 感谢您的建议!我才开始学习C++。请写更多关于它的内容,我不确定你是否理解。

标签: c++11 enums


【解决方案1】:

您甚至可以编写一个通用的转换函数,该函数应该能够将任何枚举类转换为其底层类型(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);
}

【讨论】:

  • 非常感谢!这对我真的很有帮助。但是如何才能捕获类型转换的错误?
  • 拜托,你能解释一下这部分代码是什么-&gt; typename td::underlying_type&lt;E&gt;::type吗?
  • 请解释一下如何使用这个功能。现在,我尝试这样做:Action a = toUnderlyingType(my_unsigned_int_var);
  • 称为尾随返回类型,见en.cppreference.com/w/cpp/language/function
  • 这些不是将枚举数(命名值)转换为适当的原始整数吗?我读了OP想要相反的东西。在这种情况下,Martin Bonner 的回答更好地解决了这个问题。
【解决方案2】:

我很喜欢这个开关,因为它意味着你可以添加一个default: assert(!"Bad value in database"); 行。另一方面:

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

也可以。

【讨论】:

  • 感谢您的样品!我明白这是一个不好的方法。但我没有其他价值,仅来自这个枚举。
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 2010-10-30
  • 2023-03-31
相关资源
最近更新 更多