向量值boost :: program_options的默认值

时间:2016-11-23 01:59:59

标签: c++ boost-program-options

我有一个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}?

等默认值创建向量值浮点选项

1 个答案:

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