2014-05-14 3 views
5

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.

Antwort

3

Sie müssen nicht auf die Unvollkommenheit der collect_unrecognized() Rückgabewert verlassen, können Sie immer erkennen, behandeln und die Möglichkeiten, sich zu rekonstruieren, wie das Ergebnis der parse_config_file() die Beziehung für die unbekannten Optionen beobachtet hält:

auto parsed_options = parse_config_file(ifs, config_file_options, true); 
store(parsed_options, vm); 
... 
for (const auto& o : parsed_options.options) { 
    if (vm.find(o.string_key) == vm.end()) { 
     // an unknown option 
     cout << o.string_key << "=" << o.value << "\n"; 
    } 
} 
+0

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