gpt4 book ai didi

c++ - 使用 '--' 作为带有 boost::program_options 的选项结束标记

转载 作者:IT老高 更新时间:2023-10-28 22:20:48 25 4
gpt4 key购买 nike

指示命令行程序选项结束的传统方式是使用选项--。 .如何让 boost::program_options 将其识别为选项并接受命令行的其余部分作为位置参数?以下不起作用:

namespace po = boost::program_options;

po::positional_options_description posOpts;
posOpts.add("keywords", 1);
posOpts.add("input", 1);

std::vector<std::string> final_args;

po::options_description desc("Allowed Options");
desc.add_options()
...
("", po::value< std::vector<std::string> >(&final_args)->multitoken(), "end of options")
...
;

po::command_line_parser(argc, argv).options(desc).positional(posOpts).run();

如果我给 foo bar作为论据,我在 final_args 中一无所获(如预期的那样),而且当我给 -- foo bar作为参数(当我希望找到 final_args[0] == "foo"final_args[1] == "bar" 时)。我在这里假设 --是一个长参数,其参数名称为空字符串。相反,如果它应该被解释为一个简短的参数,使用 -作为参数名称,我该如何指定?从 "" 更改参数规范至",-"据我所知,不影响结果。

如何获得 boost::program_options 来处理 --正确吗?

编辑:这是一个尝试通过创建 extra_style_parser 来执行 Tim Sylvester 建议的操作。 :

std::vector<po::option> end_of_opts_parser(std::vector<std::string>& args) {
std::vector<po::option> result;

std::vector<std::string>::const_iterator i(args.begin());
if (i != args.end() && *i == "--") {
for (++i; i != args.end(); ++i) {
po::option opt;
opt.string_key = "pargs";
opt.original_tokens.push_back(*i);
result.push_back(opt);
}

args.clear();
}

return result;
}

"pargs"被添加到这样的选项中:

("pargs", po::value< std::vector<std::string> >(&pargs), "positional arguments")

使用 -- 运行它在参数列表中导致 required_option异常(exception)。 (如果不是为每个尾随 arg 制作 po::option,我会得到类似的结果,而是将它们全部打包到 po::option::original_tokens 中一个 po::option。)

最佳答案

有一个简单但不令人满意的解决方法:在将 argv 移交给 command_line_parser 之前,检查其中是否出现 --。如果是这样,请将 argc 重置为 -- 的位置以隐藏它以及从 command_line_parser 中跟踪它的参数。然后,完成解析后,手动处理 -- 之后的位置参数。废话!

关于c++ - 使用 '--' 作为带有 boost::program_options 的选项结束标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475693/

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