[program_options] comma separated options

Hi, Someone asked me if it was possible to "easily" specify an option that would allow to specify a vector of values. The first options that came in mind was to use "multitoken". But that solution had to drawback in that situation: - ambiguous with respect to positional parameters - clumsy when you want to allow options to be specified in files, since you have to write: option 12 option 42 ... instead of: option 12 42 19 So I though about using a custom validator, which implies introducing a new type too, if I understand correctly. Something along the lines of: ======================= ... template<typename T> struct option_sequence { std::vector<T> values; }; template<typename T> void validate(boost::any& v, const std::vector<std::string>& values, option_sequence<T>* target_type, int) { namespace po = boost::program_options; namespace alg = boost::algorithm; std::vector<T> result; typedef std::vector<std::string> strings; for ( strings::const_iterator iter = values.begin(); iter != values.end(); ++iter ) { strings tks; alg::split(tks, *iter, alg::is_any_of(":")); for( strings::const_iterator tk = tks.begin(); tk != tks.end(); ++tk) { result.push_back(boost::lexical_cast<T>(*tk)); } } v = option_sequence<T>(); boost::any_cast<option_sequence<T>&>(v).values.swap(result); } int main(int argc, char* argv[]) { .... desc.add_options() ("values,v", po::value<option_sequence<int> >(), "a vector of ':' separated values as in \"12:42:-20\"."); =================== Obviously, one could think that some flexibility could be added (separators for starters) but you get the idea. Is that the right way to go (the intermediate option_sequence template seems clumsy for the user (but you need to distinguish from std::vector's) and if yes, could such a thing be added to the library ? (if yes a could propose a patch for consideration). Cheers -- ===================================== Alain Miniussi DSI/Pôle Génie Logiciel Scientifique Observatoire de la Côte d'Azur
participants (1)
-
Alain Miniussi