una sirven salida que programación programacion parametros parametro para los función funcion estructura entrada ejemplos argumentos argumento c++ boost command-line-arguments boost-program-options

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; }