矢量的默认值 boost::program_options

Default value for vector valued 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");

给出编译器错误

error: static assertion failed: Source type is neither std::ostream`able nor std::wostream`able

如何创建具有默认值(如 {0,1,2})的矢量值浮点选项?

由于类型 std::vector<double>ostreamoperator<< 丢失导致的问题。此运算符需要提供默认值的文本表示。在 boost\program_options\value_semantic.hpp header 中,您可以找到有关此要求的评论:

/** Specifies default value, which will be used if none is explicitly specified. The type 'T' should provide operator<< for ostream. */

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; 
  }
} 

Boost 能够解析 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");