Mit Befehlszeilenoptionen kann ich folgendes tun:Nicht registrierte Optionen für Konfigurationsdateien in Boost program_options analysieren?
po::variables_map vm;
auto parsedOptions = po::command_line_parser(argc, argv).options(optionsDescription1).allow_unregistered().run();
po::store(parsedOptions, vm);
po::notify(vm);
auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional);
po::variables_map vm2;
auto parsedOptions2 = po::command_line_parser(unregistered).options(optionsDescription2).run();
po::store(parsedOptions2, vm2);
po::notify(vm2);
Das funktioniert gut, weil collect_unregistered()
der Zeilenbefehl sammelt Token genau so, wie es in der Befehlszeile erschien. Es funktioniert jedoch nicht für Konfigurationsdateien. Ich kann eine Konfigurationsdatei analysieren, die nicht registrierte Optionen zulässt, aber wenn ich die nicht registrierten Optionen abrufe, erhalte ich ein Ergebnis, das ich nicht verwenden kann.
po::variables_map vm;
auto parsedOptions = po::parse_config_file<char>(filename, optionsDescription1, true);
po::store(parsedOptions, vm);
po::notify(vm);
auto unregistered = po::collect_unrecognized(parsedOptions.options, po::include_positional);
In diesem Fall bekomme ich die Namen und Werte der Optionen aufgelistet. Zum Beispiel enthalten, wenn die Konfigurationsdatei die folgenden Optionen:
unregistered_option1=value1
unregistered_option2=value2
Dann bekomme ich die Werte unregistered_option1
, value1
, unregistered_option2
, value2
im String-Vektor unregistered
. Boost's Parser kann mit diesem Format nichts anfangen. Gibt es eine Möglichkeit, diese Liste zu analysieren (d. H. Alle Optionen zu analysieren, die von der ersten options_description
mit einer anderen options_description
nicht erkannt wurden)? Natürlich kann ich die Datei erneut mit dem zweiten options_description
mit allow_unregistered
Satz analysieren, aber dann kann ich nicht nach Optionen suchen, die beiden Beschreibungen unbekannt sind.
Ich weiß nicht seit wann, aber es gibt jetzt ein '.unregistered' bool Daten Mitglied in den einzelnen Optionen, die überschliffen werden. Es ist also nicht nötig, nach "vm" zu suchen, um herauszufinden, ob es nicht mehr registriert wurde. – PeterT