问题描述
我正在编写一个以枚举MyEnum
作为输入的函数。根据MyEnum的值,我初始化一个对象并对其进行处理。我无法更改这些对象(其类)的类层次结构,因为它们来自外部依赖项。处理新创建的对象总是相同的。
问题:
我该如何“优雅地”写出来。我不想写很长的if,if,if,else块,而该块会不断重复,这就是我目前正在做的事情。我想拥有一个魔术函数,该函数告诉我在运行时使用的类型。 Afaik这个不存在。
我想要的东西
magic_function(enum_kNown_at_runtime) my_object;
如果我在编译时知道值,该怎么办: play with code
enum class MyEnum { A,B,/* many more values */ };
template <MyEnum>
struct get_type;
template <>
struct get_type<MyEnum::A> {
using Type = unsigned int; // some type
};
...
int main() {
get_type<enum_kNown_at_compiletime>::Type i;
// do stuff with i
}
我目前正在做什么:
if (enum_kNown_at_runtime == MyEnum::A) {
// init an object of some type and do stuff with it
} else if (enum_kNown_at_runtime == MyEnum::A) {
// init an object of other type and do same stuff with it
} ...
解决方法
让我们假设您在模板函数中捕获了重复的代码,并为get_type
定义了相应的实例:
template <MyEnum E>
struct get_type;
template <MyEnum E>
void init_object_do_stuff() {
using T = get_type<E>::type;
T client;
client.do_stuff();
}
您现在可以按以下方式编写重复的代码:
switch (enum_known_at_runtime) {
case MyEnum::A: init_object_do_stuff<MyEnum::A>(); break;
case MyEnum::B: init_object_do_stuff<MyEnum::B>(); break;
}
现在,新枚举的工作是添加一行并为get_type
添加一个额外的大小写,您可以使用宏进一步缩小它。另外,如果您的switch
未涵盖所有情况,编译器会大吼大叫。