清理 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 可能是最简单的解决方案。