【发布时间】:2019-03-15 13:05:11
【问题描述】:
我的最终目标是实现从一组两个字符串到对应数据类型的映射:
"AA" --> char
"BB" --> int
"CC" --> float
"DD" --> std::complex<double>
and so on ...
我能想到的最好的“不太有效”的解决方案是两部分。第一部分是使用 std::map 在字符串和相应的枚举值之间进行映射。第二部分使用模板化类型别名和 std::conditional 将枚举值映射到类型。
enum class StrEnum { AA, BB, CC, DD };
// STEP 1: string --> enum
// !! std::map will not work here since a constexpr is required !!
std::map<std::string, StrEnum> str_map = {
{"AA", StrEnum::AA},
{"BB", StrEnum::BB},
{"CC", StrEnum::CC},
{"DD", StrEnum::DD}
};
// STEP 2: enum --> type
template<StrEnum val> using StrType = typename std::conditional<
val == StrEnum::AA,
char,
typename std::conditional<
val == StrEnum::BB,
int,
typename std::conditional<
val == StrEnum::CC,
float,
std::complex<double>
>::type
>::type
>::type;
目标用法:
StrType<str_map["BB"]> myVal; // <-- does not work in current state with std::map
随着更多值映射的添加,上述嵌套会变得非常糟糕。
是否有更好/更清洁/有效的整体方法来实现此映射?我对第 2 步以及是否有办法减少嵌套特别感兴趣。
我正在使用 C++11。 (但如果唯一的答案在于 C++14 或更高版本,那么至少知道它会很好)
【问题讨论】:
-
明确一点:您希望此映射在编译时工作?
-
这段代码真的按原样工作吗?
-
Hana 可能对您有用,但将两个字符的键转换为类型可能有点尴尬。
-
请注意,您的代码缺少几个
typename(在每个std::conditional之前)以符合要求。我猜你正在使用 MSVC? -
我对缺少的类型名不好。我编辑了帖子以添加它们。我实际上使用 gcc 作为我的编译器。 @ Max Langhof,这个映射应该在理想的编译时工作。