c++ - sirven - parametros y argumentos java
Ayuda de impresión para argumentos normales y posicionales con boost:: program_options (3)
Cuando utiliza las opciones de program_options
biblioteca Boost, es muy fácil imprimir ayuda para su programa:
boost::program_options::variables_map options;
boost::program_options::options_description optionsDesc;
boost::program_options::positional_options_description positionalOptionsDesc;
//...
if(options.count("help"))
{
cerr << optionsDesc << endl;
}
Pero, ¿cómo agregar las opciones de positional_options_description
al mensaje de ayuda? En el tutorial puedo ver el resultado de dicha configuración, al final de la sección:
http://www.boost.org/doc/libs/1_52_0/doc/html/program_options/tutorial.html#id2607297
La opción input-file
se imprime en la ayuda y es posicional. Pero no puedo ver el código. ¿Hay una forma integrada de imprimirlo, como con options_description
o tienes que hacerlo manualmente? Al parecer, la <<
no funciona para positional_options_description
, el error de compilación es:
error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’
Eche un vistazo a boost :: program_options :: positional_options_description.name_for_position (i)
El mensaje de error es algo que no está relacionado, me olvido de qué hacer con cpp11
Esto es lo que hago para imprimir automáticamente las opciones posicionales:
void printUsage(const std::string &argv0)
{
std::ostream &os = std::cout;
os << "Usage:" << std::endl;
// print only basename of argv[0]
boost::filesystem::path p(argv0);
os << " " << p.filename().string();
os << " [options]";
std::string last = "";
int rep = 0;
for(int i = 0; i < positional_options_description_.max_total_count(); i++)
{
const std::string &n = positional_options_description_.name_for_position(i);
if(n == last)
{
if(!rep) os << " ...";
if(rep++ > 1000) break;
}
else
{
os << " " << n;
last = n;
rep = 0;
}
}
os << std::endl << std::endl;
os << options_description_ << std::endl;
}
La lógica para verificar los nombres de los argumentos repetidos solo es necesaria si tiene opciones repetidas que pueden repetirse un número infinito de veces, es decir, con un conteo igual a -1, de lo contrario, puede simplificar esto un poco, por ejemplo, reemplace if... else if ...
con os << " " << n;
.
Con la versión actual (1.68) de boost, no hay forma de saber si la descripción de una opción es posicional o no, por lo que no hay nada que hacer para mejorar la ayuda, por ejemplo, excluir las opciones posicionales de la impresión.
Tenga en cuenta que la descripción de la transmisión solo imprime las opciones. No imprime el nombre del programa ni la descripción real de lo que hace el programa. Debe imprimir manualmente cualquier parámetro posicional que tenga como parte del mensaje de salida:
En lugar de
if (vm.count("help")) {
cout << "Usage: options_description [options]/n";
cout << desc;
return 0;
}
Fácilmente podrías decir
if (vm.count("help")) {
cout << "Usage: " << argv[0] << " [options] <description of positional 1> <description of positional 2> .../n";
cout << desc;
return 0;
}