pet*_*ohn 5 c++ boost boost-program-options config-files
使用命令行选项,我可以执行以下操作:
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);
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,因为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);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我得到列出的选项的名称和值.例如,如果配置文件包含以下选项:
unregistered_option1=value1
unregistered_option2=value2
Run Code Online (Sandbox Code Playgroud)
然后我得到的值unregistered_option1,value1,unregistered_option2,value2在串矢量unregistered.Boost的解析器无法对此格式执行任何有用的操作.有没有办法解析这个列表(即解析第一个options_description用不同的方法识别的所有选项options_description)?当然我可以用第二个options_description用allow_unregisteredset 来解析文件,但是后来我无法检查两个描述都不知道的选项.
你不必依赖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";
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2229 次 |
| 最近记录: |