c++syntaxboost-program-optionsoptionparserconfiguration-files

boost::program_options config file option with multiple tokens


I can not seem to be able to read from config file multitoken options like I can from command line. What is the syntax for the config file?

This is how the option description is added:

//parser.cpp
- - -
po::options_description* generic;
generic=new po::options_description("Generic options");
generic->add_options()
("coordinate",po::value<std::vector<double> >()->multitoken(),"Coordinates (x,y)");

After which I parse command and config-files.

On command line '--coordinate 1 2' works. However, when I try in config file:

coordinate = 1,2

or

coordinate= 1 2

It fails giving a invalid_option_value exception. So what exactly is the syntax for config files in case of multitoken options?


Solution

  • You can achieve the behavior you seek by writing a custom validator. This custom validator accepts :

    ./progname --coordinate 1 2
    ./progname --coordinate "1 2"
    #In config file:
    coordinate= 1 2
    

    Here is the code:

    struct coordinate {
      double x,y;
    };
    
    void validate(boost::any& v,
      const vector<string>& values,
      coordinate*, int) {
      coordinate c;
      vector<double> dvalues;
      for(vector<string>::const_iterator it = values.begin();
        it != values.end();
        ++it) {
        stringstream ss(*it);
        copy(istream_iterator<double>(ss), istream_iterator<double>(),
          back_inserter(dvalues));
        if(!ss.eof()) {
          throw po::validation_error("Invalid coordinate specification");
        }
      }
      if(dvalues.size() != 2) {
        throw po::validation_error("Invalid coordinate specification");
      }
      c.x = dvalues[0];
      c.y = dvalues[1];
      v = c;
    }
    ...
        po::options_description config("Configuration");
        config.add_options()
            ("coordinate",po::value<coordinate>()->multitoken(),"Coordinates (x,y)")
            ;
    

    References: