首页 > 解决方案 > 有没有更简单的方法来“汇集”函数调用?

问题描述

我正在编写一个处理读取文本文件的程序。

根据文件中每一行的起始关键字,我想调用不同的函数。

void funnel(string line) {
    if (line.find("Keyword1", 0) == 0){
        call_function1();
    }
    else if (line.find("Keyword2", 0) == 0){
        call_function2();
    }
    else if (line.find("Keyword3", 0) == 0){
        call_function3();
    }
 ............
}

有没有更简单/更好/更有效的方法来做到这一点,还是我被这个空漏斗的东西困住了?

ClientConnect: (blake_won) ID: 0 (IP: 192.168.0.177:29071)
Kill: 0 0 7: blake_won killed blake_two by MOD_SWORD

这些行看起来像这样,我想根据每个起始关键字调用适当的函数。该文件不是我自己的,所以我无法控制写入它的内容。

标签: c++function-call

解决方案


正则表达式可以真正帮助从统一模式中收集信息,如下所示:

std::regex pattern { R"(^(\w+):)" };
std::map<std::string, std::function<void()>> dispatch {
    { "function1", function1 },
    { "function2", function2 }
};

void funnel(const std::string& line) {
     std::smatch match;
     if (std::regex_search(line, match, pattern) && match.size() > 1) {
        auto command = match.str(1);
        auto fn = dispatch.find(command);
        if (fn != dispatch.end()) {
            fn->second();
        } else {
            std::cout << "command not recognized" << std::endl;
        }
     } else {
         std::cout << "pattern doesn't match";
     }
}

演示:https ://godbolt.org/z/s5Mqej


推荐阅读