Разбор незарегистрированных параметров для конфигурационных файлов в параметрах программы Boost?
С помощью параметров командной строки я могу сделать следующее:
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);
Это работает нормально, потому что collect_unregistered() собирает маркеры командной строки точно так, как они появились в командной строке. Однако он не работает для конфигурационных файлов. Я могу проанализировать конфигурационный файл, разрешающий незарегистрированные параметры, но когда я собираю незарегистрированные параметры, я получаю результат, который я не могу использовать.
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);
В этом случае я получаю имена и значения перечисленных параметров. Например, если конфигурационный файл содержит следующие варианты:
unregistered_option1=value1
unregistered_option2=value2
Тогда я получаю значения unregistered_option1, value1, unregistered_option2, value2 в строковом векторе unregistered. Парсер Boost не может сделать ничего полезного с этим форматом. Есть ли способ проанализировать этот список (т. е. проанализировать все варианты, которые не были распознаны первым options_description с другим options_description)? Конечно, я могу просто снова проанализировать файл со вторым options_description с набором allow_unregistered, но тогда я не могу проверить параметры, неизвестные обоим описаниям.
1 ответ:
Вам не нужно полагаться на несовершенства возвращаемого значения
collect_unrecognized(), вы всегда можете обнаружить, обработать и реконструировать варианты самостоятельно, так как результатparse_config_file()сохраняет наблюдаемое отношение для неизвестных вариантов: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"; } }
Comments