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
Était-ce utile?

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"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top