【发布时间】:2011-03-29 16:17:47
【问题描述】:
指示命令行程序选项结束的传统方式是使用选项--。如何让 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 异常。 (如果不是为每个尾随 arg 制作一个 po::option,而是将它们全部打包到一个 po::option::original_tokens 中,我会得到类似的结果 po::option。)
【问题讨论】:
-
命令行中
--后面会出现什么? -
在我的特定情况下,它将介于零和两个文件名之间,包括在内。我有一个以连字符开头的文件并非不可能。