22

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

configOptions.add_options()
    ("item_*", value<int>(), "items");

此声明按预期工作并认可item_1,item_3等,同时拒绝未知选项。那么现在的问题是,我如何编写一个自定义验证函数,该函数将使用选项键及其值填充地图,如下所示:

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

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

template <typename T> void validate(boost::any& v, const std::vector<std::string>& values, map<string, T> *, int)
4

1 回答 1

1

您需要遍历所有参数来识别哪个具有正确的前缀或编写自定义解析器。这两个选项的说明都在以下链接的正确答案中:

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

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

于 2013-06-12T13:46:42.727 回答