2010-03-29 13 views
9

Chciałbym przekazać wiele argumentów z wartościami dodatnimi lub ujemnymi. Czy można to przeanalizować?BOOST program_options: parsowanie wielu argumentów lista

Obecnie mam następujący inicjalizacji:

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

i chciałbym zadzwonić:

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

Tak, program_options zakłada, że ​​jestem przechodzącej -2 jako inną opcję.

Czy mogę skonfigurować opcje programu w taki sposób, aby mógł akceptować ujemne liczby całkowite?

Dzięki Arman.

EDIT: BTW ja analizowania go przez prosty parser

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

, ale solution było użyć przedłużony jeden:

parse_command_line 

Odpowiedz

8

Próbowałeś "-2" ?

Edit: Cytowanie wydaje się nie załatwi jednak, zmieniając styl wiersza poleceń działa:

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 są stripping "", więc "-2" stał -2, również \ -2 przyjmuje opcję \ -2, pojedyncze cudzysłowy "-2" pozostają takie, jakie są. – Arman

+0

Więc cytaty są usuwane i jest interpretowane jako inna opcja? To dziwne, z dokumentacji [1] wydawało się, że to będzie droga. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

Przypuszczam, że zacytowanie całej listy również nie działa?(--IDlist = "0 1 200 -2") – kloffy

-1

może spróbować --IDlist "0, 1, 200, -2" lub --IDlist = "0, 1, 200, -2"

+0

to nie działa – hAcKnRoCk

5

UWAGA: jest to uwaga na zaakceptowane rozwiązanie.

Wyłączenie krótkich opcji jest kluczem. Rozwiązanie powyższe zaproponowane przez kloffy działa świetnie, ale jeśli używasz positional_option_description (np. Do analizowania parametrów bez użycia opcji, takiej jak ls file.txt instead of ls --file=file.txt), może być trudno przekonwertować kod, aby to zrobić, używając parse_command_line.

Jednak można również wyłączyć opcje krótkich i zachować przy użyciu basic_command_line_parser takiego:

Wymień

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

z

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

dzięki, dobrze wiedzieć! – Arman

+0

Dobra uwaga. Wobec tego samego problemu, zakończyłem czytanie liczb jako łańcuchów i posunięcie użytkownika do użycia cytatów dla liczb ujemnych, aby uniknąć wyłączenia krótkich opcji. – TomasG

Powiązane problemy