我最近发现了一个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)
答案 0 :(得分:1)
您需要遍历所有标识具有正确前缀的参数或编写自定义解析器。这两个选项的说明都在以下链接的正确答案中:
boost::program_options: parameters with a fixed and a variable token?
迭代选项可能看起来更容易理解(实现和读取),但自定义解析器似乎也很好(尽管我从未使用它)。