2012-04-16 8 views
5

Uso boost::program_options para proporcionar una interfaz de análisis de línea de comandos para mi aplicación. Me gustaría configurarlo para analizar las opciones,Cómo manejar los parámetros no solicitados en boost :: program_options

using namespace boost::program_options; 
options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file"); 

positional_options_description p; 
p.add("input-file", 1); 

variables_map vm; 

parsed_options parsed = command_line_parser(ac, av). 
options(desc).positional(p).run(); 
store(parsed, vm); 
notify(vm); 

me gustaría configurarlo para que cada símbolo después del último interruptor se devuelve en una forma de vector. He intentado usar collect_unrecognized según el ejemplo que figura en la documentación de Boost, pero he tenido algunos problemas porque también estoy usando argumentos posicionales para el archivo de entrada.

Básicamente me gustaría hacerlo así. Si tengo:

./program -i "inputfile.abc" argument1 argument2 argument3 

me gustaría para almacenar inputfile.abc en el valor input-file y devolver una vector<string> de argument1, argument2 y argument3 argumentos como no solicitados.

Me gustaría sin embargo también me gusta ser capaz de tener un argumento posicional, por lo que

./program "inputfile.abc" argument1 argument2 argument3 

me daría el mismo resultado.

Disculpa si esto ya se ha pedido y gracias por tu ayuda.

Respuesta

3

Se me ocurrió un código que hace el truco, pero es una pequeña solución. Es decir, abandoné la cláusula posicional y recurrí a tomar el primer argumento de los no reconocidos. Parece estar funcionando bien, pero no es muy flexible.

using namespace boost::program_options; 

options_description desc("Allowed options"); 
desc.add_options() 
    ("help,h", "produce help message") 
    ("version,v", "print the version number") 
    ("include-path,I", value< vector<string> >(), "include path") 
    ("input-file,i", value<string>(), "input file") 
    ; 

variables_map vm; 
vector<string> additionalParameters; 

parsed_options parsed = command_line_parser(ac, av). 
    options(desc).allow_unregistered().run(); 
store(parsed, vm); 
additionalParameters = collect_unrecognized(parsed.options, 
    include_positional); 
notify(vm); 

if (!vm.count("input-file")) 
    if (additionalParameters.empty()) 
    { 
     cerr << "error: No input file specified\n"; 
     return EXIT_FAILURE; 
    } 
    else 
    { 
     inputFileName = additionalParameters[0]; 
     additionalParameters.erase(additionalParameters.begin()); 
    } 
else 
    inputFileName = vm["input-file"].as<string>(); 
Cuestiones relacionadas