gpt4 book ai didi

c++ - 合并大量参数处理的简洁方法是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:11:10 25 4
gpt4 key购买 nike

我正在尝试清理一段代码,该代码将解析命令行提示以运行特定功能。该工具的初衷是作为调用多个较低级别工具来完成各种任务的最高级别接口(interface)。问题是当该工具开始具有越来越多的功能时,我最终遇到了一个巨大的参数解析 block 。

if (cmdParseOption(&argc, &argv, "-doit0"))
{
flag = 0;
}
else if (cmdParseOption(&argc, &argv, "-doit1"))
{
flag = 1;
}
else if (ecmdParseOption(&argc, &argv, "-doit2"))
{
flag = 2;
var = 1;
}

大约有 30 个不同的命令,这看起来很糟糕,我倾向于不喜欢代码中的大 else/if block 。有没有更简洁的方法来完成大型命令解析?考虑 switch/case 语句,但想看看是否有人知道更好的方法。大多数情况只是简单地设置一些变量,这些变量稍后会在一般函数中处理。

最佳答案

我假设 cmdParseOption() 的第三个参数是一个 const char *

在任何版本的 C++ 中,

#include<string>
#include <map>
typedef void (*function)();

void func1() {}; // we want to call this function for "-doit1"
void func2() {}; // we want to call this function for "-doit2"

int main()
{
std::map<std::string, function> option_map;
option_map["-doit1"] = func1;
option_map["-doit2"] = func2;
// etc

for (std::map<std::string>::const_iterator i = option_map.begin(), end = option_map.end(); i != end; ++i)
{
if (cmdParseOption(&argc, &argv, i->first.c_str())
{
// we've found a match in the map. Call the corresponding function

(i->second)();
}
}
return 0;
}

如果您想要 30 或 300 个选项,所有需要更改的就是设置 map - 循环保持不变。

在 C++11 及更高版本中,这可以稍微简化

#include<string>
#include <map>
typedef void (*function)();

void func1() {}; // we want to call this function for "-doit1"
void func2() {}; // we want to call this function for "-doit2"

int main()
{
std::map<std::string, function> option_map{
{"-doit1", func1},
{"-doit2", func2}
};

for (auto &i : option_map)
{
if (cmdParseOption(&argc, &argv, i.first.c_str())
{
(i.second)();
}
}
return 0;
}

如果您想要其他类型的回调,在函数类型和标准库中的设施方面有很多选择。

如果您想引入另一项检查(例如,在您的第二个 else if 中调用 ecmdParseOption() 而不是 cmdParseOption()),只需设置建立第二张 map ,填充它,并根据需要对其进行迭代。

关于c++ - 合并大量参数处理的简洁方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41307813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com