boost :: program_options:发现了未记录的"*"功能,现在需要写入地图的自定义验证器

use*_*484 22 c++ boost boost-program-options

我最近发现了一个未记录的功能boost::program_options,即它接受"*"作为一个特殊的通配符,允许声明一组具有相同前缀的选项,如下所示:

configOptions.add_options()
    ("item_*", value<int>(), "items");
Run Code Online (Sandbox Code Playgroud)

该声明担任预期和认可item_1,item_3等等,而拒绝未知选项.那么问题是,如何编写一个自定义验证函数,它将使用options键及其值填充映射,如下所示:

map<string, int> itemsMap;
options_description items("items options");
    items.add_options()
        ("item_*",value<map<string, int>>(&itemsMap)->multitoken(), "items")
    ;
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 如何从validate()函数中获取验证选项的密钥?

template <typename T> void validate(boost::any& v, const std::vector<std::string>& values, map<string, T> *, int)
Run Code Online (Sandbox Code Playgroud)

Fer*_*ira 1

您需要迭代所有参数,以确定哪些参数具有正确的前缀或编写自定义解析器。这两个选项的说明位于以下链接的正确答案中:

boost::program_options:带有固定和可变标记的参数?

迭代选项可能看起来更容易理解(实现和阅读),但自定义解析器似乎也不错(尽管我从未使用过它)。