解析Boost program_options中配置文件的未注册选项

Parsing unregistered options for config files in Boost program_options?

本文关键字:注册 选项 配置文件 Boost program options 解析      更新时间:2023-10-16

使用命令行选项,我可以做以下操作:

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中得到unregistered_option1, value1, unregistered_option2, value2的值。Boost的解析器不能对这种格式做任何有用的事情。是否有任何方法来解析这个列表(即解析所有未被第一个options_description与不同的options_description识别的选项)?当然,我可以用第二个options_descriptionallow_unregistered集再次解析文件,但这样我就不能检查两个描述中未知的选项。

您不必依赖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";
    }
}