2010-03-29 7 views
9

Je souhaite transmettre les arguments multiples avec des valeurs positives ou négatives. Est-il possible de l'analyser?BOOST options_programme: analyse de la liste des arguments multiples

Actuellement, j'ai une initialisation suivante:

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

et je voudrais appeler:

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

Ainsi, les program_options suppose que je passe -2 comme une autre option. Puis-je configurer les options_programme de telle sorte qu'elles puissent accepter les valeurs entières négatives?

Merci Arman.

EDIT: BTW je l'analyse par l'analyseur simple

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

, mais solution était d'utiliser l'étendue d'un:

parse_command_line 

Répondre

8

Avez-vous essayé "-2" ?

Edit: ne semble pas citant faire l'affaire, cependant, changer le style de ligne de commande fonctionne:

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 sont stripping "", donc "-2" est devenu -2, aussi l'option \ -2 prend comme option -2, les guillemets simples '-2' restent tels quels. – Arman

+0

Donc les guillemets sont effacés et interprétés comme une autre option? C'est étrange, d'après la documentation [1] il semblait que ce serait le chemin à parcourir. [1] http://www.boost.org/doc/libs/1_42_0/doc/html/program_options/overview.html#id1419101 – kloffy

+0

Je suppose que la citation de la liste entière ne fonctionne pas non plus?(--ID = "0 1 200 -2") – kloffy

-1

peut-être essayer --IDlist "0, 1, 200, -2" ou --IDlist = "0, 1, 200, -2"

+0

cela ne fonctionne pas – hAcKnRoCk

5

NOTE: Ceci est une remarque à la solution acceptée.

La désactivation des options courtes est la clé. La solution ci-dessus proposée par kloffy fonctionne très bien, mais si vous utilisez positional_option_description (par exemple pour analyser les paramètres sans utiliser une option comme ls file.txt instead of ls --file=file.txt) vous pourriez avoir du mal à convertir votre code pour le faire en utilisant parse_command_line.

Cependant, vous pouvez également désactiver les options courtes et continuer à utiliser la basic_command_line_parser comme ceci:

Remplacer

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

avec

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

merci, bon à savoir! – Arman

+0

Bon point. Face au même problème, j'ai fini par lire les chiffres sous forme de chaînes et à demander à l'utilisateur d'utiliser des guillemets pour les nombres négatifs, pour éviter de désactiver les options courtes. – TomasG