Разбор незарегистрированных параметров для конфигурационных файлов в параметрах программы 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, но тогда я не могу проверить параметры, неизвестные обоим описаниям.

532   1  

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

    Ничего не найдено.