2010-03-29 10 views
9

Me gustaría pasar los argumentos múltiples con valores positivos o negativos. ¿Es posible analizarlo?BOOST program_options: análisis de lista de múltiples argumentos

Actualmente tengo una inicialización siguiente:

vector<int> IDlist; 
namespace po = boost::program_options;  
po::options_description commands("Allowed options"); 
      commands.add_options()    
       ("IDlist",po::value< vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2") 
       ("help","print help") 
       ; 

y me gustaría llamar:

./test_ids.x --IDlist=0 1 200 -2 
unknown option -2 

Así, los program_options supone que estoy pasando -2 como otra opción.

¿Puedo configurar las opciones del programa de tal manera que pueda aceptar los valores enteros negativos?

Gracias Arman.

EDIT: Por cierto me analizarlo por el analizador simple

store(command_line_parser(argc, argv).options(commands).run(), vm); 

, pero solution era utilizar la ampliada:

parse_command_line 

Respuesta

8

Ha intentado "-2" ?

Editar: Citando no parece hacer el truco, sin embargo, cambiar el estilo de línea de comandos funciona:

char* v[] = {"name","--IDlist=0","1","200","-2"}; 
int c = 5; 

std::vector<int> IDlist; 

namespace po = boost::program_options;  
po::options_description commands("Allowed options"); 
commands.add_options()    
    ("IDlist",po::value< std::vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2") 
    ("help","print help") 
; 

po::variables_map vm; 
po::store(parse_command_line(c, v, commands, po::command_line_style::unix_style^po::command_line_style::allow_short), vm); 
po::notify(vm); 

BOOST_FOREACH(int id, IDlist) 
    std::cout << id << std::endl; 
+0

program_options están desnudando "", por lo que "-2" se convirtió en -2, también la opción \ -2 toma como \ -2, las comillas simples '-2' permanecen como están. – Arman

+0

¿Las comillas se eliminan y se interpreta como otra opción? Es extraño, según la documentación [1], parecía que sería el camino a seguir. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

Supongo que citar toda la lista tampoco funciona?(--IDlist = "0 1 200 -2") – kloffy

-1

quizás tratar --IDlist "0, 1, 200, -2" o --IDlist = "0, 1, 200, -2"

+0

esto no funciona – hAcKnRoCk

5

NOTA: esto es una observación de la solución aceptada.

Desactivar las opciones cortas es la clave. La solución anterior propuesta por kloffy funciona muy bien, pero si usa positional_option_description (por ejemplo, para analizar los parámetros sin utilizar una opción como ls file.txt instead of ls --file=file.txt) puede tener dificultades para convertir el código para hacer eso usando parse_command_line.

Sin embargo también se puede desactivar las opciones cortas y seguir usando el basic_command_line_parser así:

Reemplazar

store(command_line_parser(argc, argv).options(commands).run(), vm); 

con

store(command_line_parser(argc, argv).options(commands).style(
po::command_line_style::unix_style^po::command_line_style::allow_short 
).run(), vm); 
+0

gracias, es bueno saberlo! – Arman

+0

Buen punto. Enfrentando el mismo problema, terminé leyendo los números como cadenas y haciendo que el usuario utilizara comillas para los números negativos, para evitar deshabilitar las opciones cortas. – TomasG

Cuestiones relacionadas