指示命令行程序选项结束的传统方法是使用选项--
。我怎样才能得到boost :: program_options认识到这是一个选项,并接受命令行的其余部分作为位置参数?以下不工作:使用' - '作为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
:
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
异常。 (我得到类似的结果,如果不是制作po::option
每个尾随阿根廷,我收拾他们全部纳入po::option::original_tokens
在一个po::option
。)
什么将遵循'--'在命令行? – 2011-03-29 16:40:31
在我的具体情况下,它将介于零和两个文件名之间,包括两个文件名。我有一个以连字符开头的文件并不是不可能的。 – uckelman 2011-03-29 17:28:06