清理 switch 语句
Cleaning up a switch statement
我有一个容器 class,其中包含一个 char 数组和一个 enum/integer,指示应将 char 数组转换为什么。我在回调中这样使用它:
void callback(Foo& foo){
switch(foo.type()){
case(1): do( (Bar1*) foo.stuff() );
case(2): do( (Bar2*) foo.stuff() );
case(3): do( (Bar3*) foo.stuff() );
...
}
}
有没有办法存储从整数到类型 (1, Bar1), (2, Bar2)
等的映射,以便我可以清理这个 switch 语句,因为它越来越长了?或者,在这种情况下是否可以使用任何模板元编程习语?
将您的对象存储在 std::variant
instead of rolling your own using an array of char
. Along with std::visit
中,它完全支持您需要的用例:
void callback(std::variant<Foo1, Foo2, Foo3>& foo) {
std::visit([](auto& f) { doit(f); }, foo);
}
如果您不能使用 std::variant
,那么给定一组已知类型,switch
可能是最简单的解决方案。
我有一个容器 class,其中包含一个 char 数组和一个 enum/integer,指示应将 char 数组转换为什么。我在回调中这样使用它:
void callback(Foo& foo){
switch(foo.type()){
case(1): do( (Bar1*) foo.stuff() );
case(2): do( (Bar2*) foo.stuff() );
case(3): do( (Bar3*) foo.stuff() );
...
}
}
有没有办法存储从整数到类型 (1, Bar1), (2, Bar2)
等的映射,以便我可以清理这个 switch 语句,因为它越来越长了?或者,在这种情况下是否可以使用任何模板元编程习语?
将您的对象存储在 std::variant
instead of rolling your own using an array of char
. Along with std::visit
中,它完全支持您需要的用例:
void callback(std::variant<Foo1, Foo2, Foo3>& foo) {
std::visit([](auto& f) { doit(f); }, foo);
}
如果您不能使用 std::variant
,那么给定一组已知类型,switch
可能是最简单的解决方案。