Con le opzioni della riga di comando, posso effettuare le seguenti operazioni:Analisi delle opzioni non registrate per i file di configurazione in Boost program_options?
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);
Questo funziona bene, perché collect_unregistered()
raccoglie la linea di comando pedine esattamente come appariva nella riga di comando. Tuttavia, non funziona per i file di configurazione. Posso analizzare un file di configurazione che consente opzioni non registrate, ma quando raccolgo le opzioni non registrate, ottengo un risultato che non posso utilizzare.
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 questo caso ottengo i nomi e i valori delle opzioni elencate. Ad esempio, se il file di configurazione contiene le seguenti opzioni:
unregistered_option1=value1
unregistered_option2=value2
tanto sono i valori unregistered_option1
, value1
, unregistered_option2
, value2
nel vettore stringa di unregistered
. Il parser di Boost non può fare nulla di utile con questo formato. C'è un modo per analizzare questo elenco (ad esempio, analizzare tutte le opzioni che non erano state riconosciute dal primo options_description
con un diverso options_description
)? Naturalmente posso solo analizzare il file di nuovo con il secondo options_description
con il set allow_unregistered
, ma non riesco a verificare le opzioni sconosciute per entrambe le descrizioni.
Non so da quando, ma ora c'è un membro di dati bool ".unregistered" nelle singole opzioni che sono in loop. Quindi non c'è bisogno di cercare tutti i 'vm' per scoprire se non è stato registrato più. – PeterT