具有多个标记的boost :: program_options配置文件选项

时间:2011-05-04 13:50:06

标签: c++ syntax boost-program-options optionparser config-files

我似乎无法从命令行中读取配置文件多音色选项。配置文件的语法是什么?

这是添加选项说明的方式:

//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)");

之后我解析命令和配置文件。

在命令行'--coordinate 1 2'工作。但是,当我尝试配置文件时:

coordinate = 1,2

coordinate= 1 2

无法提供invalid_option_value异常。那么在多音色选项的情况下,配置文件的语法到底是什么?

3 个答案:

答案 0 :(得分:9)

在配置文件中,将矢量的每个元素放在不同的行上。

coordinate=1
coordinate=2

答案 1 :(得分:6)

您可以通过编写自定义验证程序来实现您所寻求的行为。此自定义验证器接受:

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

以下是代码:

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)")
        ;

参考文献:

答案 2 :(得分:0)

在发现自己遇到类似问题时,我从Rob的回答(2011年5月4日)中获取了上述代码,但由于boost架构和C ++的变化,我不得不改变一些事情。 11。我只引用我改变的部分(或者会改变的部分)。不在validate函数内的其余部分保持不变。出于符合性的原因,我添加了必要的std ::前缀。

namespace po = boost::program_options;

void validate(boost::any& v,
  const std::vector<std::string>& values,
  coordinate*, int) {
  coordinate c;
  std::vector<double> dvalues;
  for(const auto& val : values)  {
    std::stringstream ss(val);
    std::copy(std::istream_iterator<double>(ss), std::istream_iterator<double>(),
      std::back_inserter(dvalues));
    if(!ss.eof()) {
      throw po::invalid_option_value("Invalid coordinate specification");
    }
  }
  if(dvalues.size() != 2) {
    throw po::invalid_option_value("Invalid coordinate specification");
  }
  c.x = dvalues[0];
  c.y = dvalues[1];
  v = c;
}

https://stackoverflow.com/a/12186109/4579106

中暗示了从po :: validation_error到po :: invalid_option_value的转变