2010-03-29 14 views
9

vorrei passare gli argomenti multipli con valori positivi o negativi. È possibile analizzarlo?program_options Boost: parsing lista degli argomenti più

Attualmente ho un seguito di inizializzazione:

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") 
       ; 

e vorrei chiamare:

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

Così, le program_options presuppone che sto passando -2 come un'altra opzione.

Posso configurare le program_options in modo che possa accettare i valori interi negativi?

Grazie Arman.

EDIT: BTW ero analizzarlo dal semplice parser

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

, ma solution è stato quello di utilizzare la distesa:

parse_command_line 

risposta

8

Hai provato "-2" ?

Edit: Citando non sembra fare il trucco, però, cambiare lo stile della linea di comando funziona:

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 sono spogliando "", in modo da "-2" è diventato -2, anche il \ -2 prende come opzione \ -2, le virgolette singole '-2' rimangono invariate. – Arman

+0

Quindi le virgolette sono rimosse e vengono interpretate come un'altra opzione? È strano, dalla documentazione [1] sembrava che sarebbe stata la strada da percorrere. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

suppongo citando l'intero elenco non funziona neanche?(--IDlist = "0 1 200 -2") – kloffy

-1

magari provare --IDlist "0, 1, 200, -2" o --IDlist = "0, 1, 200, -2"

+0

questo non funziona – hAcKnRoCk

5

NOTA: questa è un'osservazione alla soluzione accettata.

Disabilitare le opzioni brevi è la chiave. La soluzione sopra proposta da kloffy funziona benissimo, ma se si utilizza positional_option_description (ad esempio per analizzare i parametri senza utilizzare un'opzione come ls file.txt instead of ls --file=file.txt), potrebbe essere difficile convertire il codice per farlo utilizzando parse_command_line.

Tuttavia è anche possibile disattivare le opzioni a breve e continuare a utilizzare il basic_command_line_parser in questo modo:

Sostituire

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

grazie, buono a sapersi! – Arman

+0

Buon punto. Affrontando lo stesso problema, ho finito col leggere i numeri come stringhe e l'utente a usare le virgolette per i numeri negativi, per evitare di disabilitare le opzioni brevi. – TomasG

Problemi correlati