Традиционным способом указания конца опций программ командной строки является опция --
. Как я могу получить 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
для каждого завершающего arg, я упаковываю их все в po::option::original_tokens
в один po::option
.)