使用命令行选项,我可以做以下操作:
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_description
和allow_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";
}
}