提升program_options部分键匹配 [英] Boost program_options partial key match

查看:82
本文介绍了提升program_options部分键匹配的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用Boost :: program_options读取配置文件.配置文件如下:

I'm trying to read config files with Boost::program_options. The config files look like:

hier.arch.y.option_name = 0x5
another.hier.archy.setting_name = 0x1E

我希望能够仅通过"option_name"或"setting_name"进行搜索.我不太担心重复项,但是如果有一种方法可以选择匹配2个子字符串(即另一个" +设置名称"),那也很好.

I want to be able to search by just "option_name" or "setting_name". I'm not worried too much about duplicates but if there's a way optionally to match 2 substrings (i.e. "another" + "setting_name") that'd be great too.

有没有一种方法可以使program_options基于子字符串进行匹配?

Is there a way to get program_options to match based on substring?

代码示例:

namespace po = boost::program_options;
po::options_description cmd_opts{"Options"};
po::options_description config_file_opts;
cmd_opts.add_options()
  ("help,h", "Help message")
  ("config_help", "List of configurations available in config file");

po::variables_map vm;
po::store(parse_command_line(argc, argv, combined_opts), vm);
auto parsed_opts = po::parse_config_file<char>(vm.["config_file"].as<std::string>);
po::store(parsed_opts, vm);

配置文件:

foo.bar.setting0 = 0x5
foo.notbar.setting1 = 0x6
bar.notfoo.setting2 = 0x5E

我想分配以下选项:

int setting0;
int setting1;
int setting2;

推荐答案

问枚举已解析的选项是什么意思?

Q. What does enumerate the parsed options mean?

A. 在Coliru上直播

A. Live On Coliru

for (auto& opt : parsed_opts.options) {
    for (auto& val : opt.value) {
        std::cout 
            << std::quoted(opt.string_key) << "\t-> "
            << std::quoted(val) << std::endl;
    }
}

打印

"foo.bar.setting0"  -> "0x5"
"foo.notbar.setting1"   -> "0x6"
"bar.notfoo.setting2"   -> "0x5E"


模糊匹配,听起来像是正则表达式工作吗?


Matching fuzzily, sounds like a regex job, maybe?

在Coliru上直播

Live On Coliru

int setting0 = 0, setting1 = 0, setting2 = 0;

struct { int& target; boost::regex re; }
    fuzzy_opt_desc[] = {
        { setting0, boost::regex{R"(bar\.setting0$)"} },
        { setting1, boost::regex{R"(^foo\..*?setting1$)"} },
        { setting2, boost::regex{R"(setting2$)"} },
    };

for (auto& opt : parsed_opts.options) {
for (auto const& desc : fuzzy_opt_desc) {
    if (boost::regex_search(opt.string_key, desc.re)) {
        for (auto& val : opt.value) {
            desc.target = std::stoul(val, nullptr, 16);
            std::cout 
                << std::quoted(opt.string_key) << "\t-> "
                << desc.target << std::endl;
        }
    }
} }

std::cout << "Finally: " << setting0 << ", " << setting1 << ", " << setting2 << "\n";

打印

"foo.bar.setting0"  -> 5
"foo.notbar.setting1"   -> 6
"bar.notfoo.setting2"   -> 94
Finally: 5, 6, 94

这篇关于提升program_options部分键匹配的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆