我需要在两组枚举之间进行映射。枚举之间是一一对应的。
例如
第一组:
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/