comment puis-je obtenir les jetons non-drapeau et non-option après boost :: program_options parse ma ligne de commande args
-
19-09-2019 - |
Question
En python, je peux construire mon optparse exemple de telle sorte qu'il filtrera automatiquement les options et les non-option / drapeaux en deux seaux différents:
(options, args) = parser.parse_args()
Avec boost :: program_options, comment puis-je récupérer une liste de jetons qui sont les non-options restantes et des jetons non-drapeau?
par exemple. Si mon programme a des drapeaux
--foo
--bar BAR
et je passe ensuite dans la ligne de commande:
--foo hey --bar BAR you
comment puis-je obtenir une liste uniquement composée de jetons « hey » et « vous »
La solution
IIRC, vous devez utiliser une combinaison de options cachées . L'idée est de (1) ajouter une option normale et lui donner un nom, peut-être quelque chose comme --positional=ARG
, (2) ne comprennent pas cette option dans la description de l'aide, (3) configurer command_line_parser
pour traiter tous les arguments de position comme si --positional
était spécifié, et (4) récupérer les arguments de position en utilisant vm["positional"].as< std::vector<std::string> >()
.
Il y a probablement un exemple quelque part dans l'arbre source, mais je ne l'ai pas sur cette machine dès maintenant.
Autres conseils
Voici un exemple:
namespace po = boost::program_options;
po::positional_options_description m_positional;
po::options_description m_cmdLine;
po::variables_map m_variables;
m_cmdLine.add_options()
(/*stuff*/)
("input", po::value<vector<string> >()->composing(), "")
;
m_positional.add("input", -1);
po::parsed_options parsed = po::command_line_parser(argc, argv)
.options(m_cmdLine)
.positional(m_positional)
.allow_unregistered()
.run();
// store, notify, etc
Ensuite, il suffit obtenir « entrée » des options nommées en tant que vecteur de chaînes et vous êtes tous ensemble.