program_options BOOST: analyse syntaxique liste d'arguments multiples
-
23-09-2019 - |
Question
Je souhaite passer les arguments multiples avec des valeurs positives ou négatives. Est-il possible de l'analyser?
Actuellement, je 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 comme une autre option -2 .
Puis-je configurer les program_options de telle manière qu'il puisse 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 la solution était d'utiliser la une étendue:
parse_command_line
La solution
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;
Autres conseils
NOTE:. ceci est une remarque à la solution acceptée
La désactivation des options courtes est la clé. La solution proposée ci-dessus par kloffy fonctionne très bien, mais si vous arrive d'utiliser 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);
peut-être essayer --IDlist "0, 1, 200, -2" ou --IDlist = "0, 1, 200, -2"