2010-03-29 4 views
9

Ich möchte die Argumente mit positiven oder negativen Werten übergeben. Ist es möglich, es zu analysieren?BOOST program_options: Analysieren mehrerer Argumentliste

Zur Zeit habe ich eine nach der Initialisierung:

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

und ich würde gerne nennen:

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

Also, die program_options geht davon aus, dass ich -2 als eine andere Option bin vorbei.

Kann ich die program_options so konfigurieren, dass die negativen ganzzahligen Werte akzeptiert werden?

Dank Arman.

EDIT: BTW habe ich es durch den einfachen Parser verarbeitet

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

, aber solution war die erweiterte man verwenden:

parse_command_line 

Antwort

8

Haben Sie versucht, "-2" ?

Edit: Zitiert scheint nicht den Trick zu tun, aber die Befehlszeile Stil zu ändern funktioniert:

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 "stripping", so "-2" wurde -2, auch das \ -2 nimmt als \ -2 Option, die einzelnen Anführungszeichen '-2' bleibt wie es ist. – Arman

+0

Also die Zitate sind abgestreift und es wird als eine andere Option interpretiert? Das ist seltsam, aus der Dokumentation [1] schien es der Weg zu sein. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

Ich nehme an, zitiert die gesamte Liste funktioniert auch nicht?(--IDlist = "0 1 200 -2") – kloffy

-1

vielleicht versuchen --IDlist "0, 1, 200, -2" oder --IDlist = "0, 1, 200, -2"

+0

das funktioniert nicht – hAcKnRoCk

5

HINWEIS: Dies ist ein Hinweis auf die akzeptierte Lösung.

Das Deaktivieren kurzer Optionen ist der Schlüssel. Die Lösung, die oben von kloffy vorgeschlagen wird, funktioniert sehr gut, aber wenn Sie positional_option_description verwenden (z. B. um Parameter zu parsen ohne eine Option wie ls file.txt instead of ls --file=file.txt zu verwenden), haben Sie möglicherweise Schwierigkeiten, Ihren Code zu konvertieren, um das mit parse_command_line zu tun.

immer Sie auch kurze Optionen deaktivieren können und halten Sie die basic_command_line_parser wie folgt aus:

ersetzen

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

mit

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

danke, gut zu wissen! – Arman

+0

Guter Punkt. Angesichts des gleichen Problems las ich die Zahlen als Strings und bat den Benutzer, Anführungszeichen für negative Zahlen zu verwenden, um zu vermeiden, dass kurze Optionen deaktiviert wurden. – TomasG