首页 > 解决方案 > 从底层类型安全地转换枚举类

问题描述

假设我有一个像这样的强类型枚举类型:

enum class message : int {
    JOIN = 0,
    LEAVE = 4,
    SPAWN = 1,
}

而且我需要安全地(在这种情况下安全地意味着丢弃无效的变体)将它从它的基础类型(int)转换。

为此,我有一个函数可以为我转换它:

std::optional<message> get_message(int num) {
    return num == (int)message::JOIN || num == (int)message::LEAVE || num == (int)message::SPAWN ? (message)num : {};
}

这很有效,但是写起来很长并且容易出错,特别是对于具有大量变体的枚举。

有没有办法在 C++17 中自动化这个过程?

标签: c++enumsintegerc++17

解决方案


谈到底层类型,我们注意到这个类只是使用另一种类型作为模型来获取一个类型,但它不会在这些类型之间转换值或对象。

作为简化功能的一个选项,您可以通过迭代枚举来工作,或者正如其他人之前所说的使用某种类型的容器,通过迭代相同的枚举作为此处的示例:如何迭代枚举? 以及有关枚举的更多信息以防万一:https ://docs.microsoft.com/en-us/cpp/cpp/enumerations-cpp?view=vs-2019


推荐阅读