Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

boost::program_options: undocumented "*" feature discovered, now need custom validator that writes to a map

Tags:

I recently discovered an undocumented feature of boost::program_options, namely that it accepts "*" as a special wildcard that allows declaration of a group of options with the same prefix, like this:

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

This declaration worked as expected and recognized item_1, item_3, etc, while rejecting unknown options. Well now the question is, how can I write a custom validate function that will populate a map with options key and its value, like this:

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

My question is - how do I get the key of the option being validated from within validate() function?

template <typename T> void validate(boost::any& v, const std::vector<std::string>& values, map<string, T> *, int) 
like image 919
user1876484 Avatar asked Jan 17 '13 16:01

user1876484


1 Answers

You need to iterate through all arguments identifying which has the correct prefix or write a custom parser. The instructions for both options are in the correct answer of the link below:

boost::program_options: parameters with a fixed and a variable token?

The iteration option might seem easier to understand (implement and read) but the custom parser seems good too (though I never used it).

like image 109
Fernando Silveira Avatar answered Oct 30 '22 00:10

Fernando Silveira