我有一个boost :: program_options选项,可以成功地将所需的输入选项解析为一个向量,但是我没有看到如何给它一个默认值。例如:
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description");
可以很好地将值读入vecoptions,例如
base.add_options()
("int_value",po::value<int>(&intoption)->default_value(1),"description");
也可以正常工作,但试图给矢量参数一个默认值,如
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description");
给出编译器错误
错误:静态断言失败:源类型既不是std :: ostream`也不是std :: wostream`able
如何使用{0,1,2}?
等默认值创建向量值浮点选项答案 0 :(得分:5)
类型为operator<<
的{{1}}错过ostream
导致的问题。此运算符需要提供默认值的文本表示。在std::vector<double>
标题中,您可以找到有关此要求的评论:
/ **指定默认值,如果未明确指定,则使用默认值。 类型&#39; T&#39;应该提供运营商&lt;&lt;对于ostream。 * /
boost\program_options\value_semantic.hpp
要解决此问题,您可以指定typed_value* default_value(const T& v)
,如:
operator<<
如果在namespace std
{
std::ostream& operator<<(std::ostream &os, const std::vector<double> &vec)
{
for (auto item : vec)
{
os << item << " ";
}
return os;
}
}
命名空间中定义了operator<<
,则可以解析std
。在这种情况下,可以指定默认参数值,如:
("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}), "description");
另一种方法是使用具有显式文本值规范的方法:
("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}, "0, 1, 2"), "description");