c++ - C++ 中的枚举映射

标签 c++ templates enums

我需要在两组枚举之间进行映射。枚举之间是一一对应的。

例如

第一组:

Enum1{A, B, C, D};
Enumx...
Enumy...

第二组:

Enum2{A2, B2, C2, D2};
Enumx2...
Enumy2...

map 功能:

Enum1 map(Enum2);
Enumx map(Enumx2);
Enumy map(Enumy2);

我正在寻找一种优雅的方式来制作这张 map 。 我可以使用模板专门化吗?或者枚举都被视为整数?

示例:

class MapHelper{
public:
    template<typename From, To>
    static To map(From from);

    template<>
    static Enum1 map<Enum2, Enum1>(Enum2 from){
    return static_cast<Enum1>(from);
    }
};

最佳答案

您可以使用特征:

template<Enum1 V> struct ToEnum2;
template<> struct ToEnum2<Enum1::A> { static constexpr Enum2 value = Enum2::A; };
template<> struct ToEnum2<Enum1::B> { static constexpr Enum2 value = Enum2::B; };
// ...

然后,只要您从 Enum1 中获得一个值,您就可以使用以下方法从 Enum2 中找到该值:

Enum1<VALUE>::value;

它遵循一个最小的工作示例:

enum class Enum1 { A, B };
enum class Enum2 { C, D };

template<Enum1 E> struct Map;
template<> struct Map<Enum1::A> { static constexpr Enum2 value = Enum2::C; };
template<> struct Map<Enum1::B> { static constexpr Enum2 value = Enum2::D; };

int main() {
    static_assert(Map<Enum1::A>::value == Enum2::C, "!");
    static_assert(Map<Enum1::B>::value == Enum2::D, "!");
}

关于c++ - C++ 中的枚举映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39635267/

相关文章:

c++ - 如何在没有初始化 shared_ptr 对象的情况下初始化对象的管理器?

c++ - PostThreadMessage 到另一个进程

c++ - 模板向后兼容 gcc 4.7

c++ - c模板成员变量错误

c# - 如何转换 int 值以列出 Flag 枚举的 int 值

c++ - 读取文件并保存完全相同的文件c++

c++ - 请帮助我在这个编译器错误丛林中找到实际错误

c++ - 模板化成员函数 typedef 无法编译

c# - 如何使用 MOQ 库模拟一个 ENum

java - 在另一个类中创建枚举对象