[英]Enum mapping in C++
我需要在兩組枚舉之間進行映射。 枚舉之間的對應關系是一對一的。
例如
第一組:
Enum1{A, B, C, D};
Enumx...
Enumy...
第二組:
Enum2{A2, B2, C2, D2};
Enumx2...
Enumy2...
地圖功能:
Enum1 map(Enum2);
Enumx map(Enumx2);
Enumy map(Enumy2);
我正在尋找一種制作這張地圖的優雅方式。 我可以使用模板專業化嗎? 還是將枚舉全部視為整數?
例:
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, "!");
}
假設您的enum
具有相同的值,則可以執行以下操作:
template <typename E> struct MappingEnum;
template <typename E>
using MappingEnum_t = typename MappingEnum<E>::type;
template <> struct MappingEnum<Enum1>
{
using type = Enum2;
};
接着
template <typename E>
MappingEnum_t<T> map(E e) { return static_cast<MappingEnum_t<T>>(e); }
C ++ 11解決方案:
#include <type_traits>
template<typename From, typename To>
To map(From e) {
return static_cast<To>(
static_cast<typename std::underlying_type<To>::type>(
static_cast<typename std::underlying_type<From>::type>(e)));
}
此強制轉換級聯非常明確,並支持枚舉類。
對於較舊的C ++版本和不帶class
枚舉, static_cast<Enum2>(e)
就足夠了。
編輯:
使用模板專業化,可以使用map
而不顯式指定任何類型:
enum class Enum1: int {A, B, C, D};
enum class Enum2: char {A1, B1, C1, D1};
template<typename T>
struct target_enum {
};
template<>
struct target_enum<Enum1> {
typedef Enum2 type;
};
template<typename From>
typename target_enum<From>::type map(From e) {
typedef typename target_enum<From>::type To;
return static_cast<To>(
static_cast<typename std::underlying_type<To>::type>(
static_cast<typename std::underlying_type<From>::type>(e)));
}
然后,您可以調用map(Enum1::A)
。 也適用於簡單的非類枚舉。
除了現在已經添加到問題中的靜態強制轉換之外,您還可以使用上一個枚舉的值在等效枚舉中設置值,從而使映射更容易/更明確:
enum Enum1
{
a = 1,
b = 2,
};
enum Enum2
{
z = a,
y = b
};
還有一種將模板折疊成只需要指定目標的方法...
template <typename targettype>
class Converter
{
public:
template<typename sourceType>
static targettype Convert(sourceType from)
{
return static_cast<targettype>(from);
}
};
可稱為:-
Converter<Enum2>::Convert(someEnum1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.