wie bekomme ich die Nicht-Flagge und nicht-Option Token nach boost :: program_options meine Befehlszeile args parst
-
19-09-2019 - |
Frage
In Python kann ich mein optparse Beispiel so konstruieren, dass sie automatisch filtern aus den Optionen und nicht-Option / Fahnen in zwei verschiedene Eimer:
(options, args) = parser.parse_args()
Mit boost :: program_options, wie kann ich eine Liste von Token abzurufen, die die verbleibenden nicht-Option und nicht-Flag-Token sind?
z. Wenn mein Programm hat Flags
--foo
--bar BAR
und ich dann in der Befehlszeile übergeben:
--foo hey --bar BAR you
Wie kann ich eine Liste bekommen besteht ausschließlich aus Token „hey“ und „Sie“
Lösung
IIRC, müssen Sie eine Kombination aus verwenden versteckte Optionen . Die Idee ist, (1) eine normale Option hinzufügen und ihm einen Namen geben, vielleicht so etwas wie --positional=ARG
, (2) umfasst nicht die entsprechende Option in der Hilfe Beschreibung, (3) konfigurieren command_line_parser
alle Positionsargumente zu behandeln, als ob --positional
war angegeben, und (4) die Positions Argumenten vm["positional"].as< std::vector<std::string> >()
abzurufen.
Es gibt wohl ein Beispiel irgendwo im Quellbaum, aber ich habe es jetzt nicht auf dieser Maschine.
Andere Tipps
Hier ist ein Beispiel:
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
Dann bekommt nur „Input“ genannt Optionen als Vektor von Strings und Sie sind alle gesetzt.