La forma tradicional de indicar el final de las opciones para los programas de línea de comando es con la opción --
. ¿Cómo puedo obtener boost :: program_options para reconocer esto como una opción y aceptar el resto de la línea de comando como argumentos posicionales? El siguiente no funciona:Usando '-' como marcador de final de opción con 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();
Si reparto foo bar
como argumentos, me sale nada en final_args
(como se esperaba), sino también cuando doy -- foo bar
como argumentos (cuando yo esperaría encontrar final_args[0] == "foo"
y final_args[1] == "bar"
) . Supongo que --
es un argumento largo con la cadena vacía como nombre de argumento. Si, en cambio, se supone que debe interpretarse como un argumento corto, con -
como el nombre del argumento, ¿cómo especifico eso? Cambiar la especificación del argumento de ""
a ",-"
no afecta el resultado, por lo que puedo ver.
¿Cómo se obtiene boost :: program_options para manejar --
correctamente?
Editar: Aquí hay un intento de hacer lo que Tim Sylvester sugerido por la creación de un 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"
se añadió a las opciones de la siguiente manera:
("pargs", po::value< std::vector<std::string> >(&pargs), "positional arguments")
La ejecución de este con un --
en la lista de argumentos provoca una excepción required_option
. (I obtener resultados similares si en lugar de hacer una po::option
para cada arg de salida, que empacar todas en po::option::original_tokens
en una po::option
.)
lo que seguirá el '--' en la línea de comandos? –
En mi caso particular, será entre cero y dos nombres de archivo, inclusive. No es imposible que tenga un archivo que comience con un guión. – uckelman