我似乎无法从命令行中读取配置文件多音色选项。配置文件的语法是什么?
这是添加选项说明的方式:
//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异常。那么在多音色选项的情况下,配置文件的语法到底是什么?
答案 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;
}
中暗示了从po :: validation_error到po :: invalid_option_value的转变