【问题标题】:Default value for vector valued boost::program_options向量值 boost::program_options 的默认值
【发布时间】:2016-11-23 01:59:59
【问题描述】:

我有一个 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`able 也不是 std::wostream`able

如何使用 {0,1,2} 等默认值创建向量值浮点选项?

【问题讨论】:

  • 不相关,但您不需要显式向po::value 提供模板参数。只需 po::value(&amp;intoption)po::value(&amp;vecoption) 就可以了。这是一个函数模板。

标签: c++ boost-program-options


【解决方案1】:

由于类型std::vector&lt;double&gt;ostream 错过operator&lt;&lt; 而导致的问题。此运算符需要提供默认值的文本表示。在boost\program_options\value_semantic.hpp 标头中,您可以找到有关此要求的评论:

/** 指定默认值,如果没有明确指定,将使用该值。 类型 'T' 应该为 ostream 提供操作符 */

typed_value* default_value(const T&amp; v)

要解决这个问题你可以指定operator&lt;&lt; like:

namespace std
{
  std::ostream& operator<<(std::ostream &os, const std::vector<double> &vec) 
  {    
    for (auto item : vec) 
    { 
      os << item << " "; 
    } 
    return os; 
  }
} 

如果operator&lt;&lt; 定义在命名空间std 中,Boost 能够解析它。在这种情况下,可以像这样指定默认参数值:

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

【讨论】:

  • 我已经指定了运营商std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, const std::vector&lt;double&gt; &amp;vec){ for (size_t i=0; i&lt;vec.size(); ++i){ os&lt;&lt; vec[i] &lt;&lt;" "; } return os; },但得到了同样的错误。假设我在 OP 中的语法错误,那么相应的选项条目是什么?您的“其他方法”适用于默认值,但不再解析作为“--vector_value=1 2 3”给出的选项。
  • 刮掉上面评论的第二部分;上面的文本表示与 ->default_value(...)->multitoken() 一起使用。如果您可以编辑您的答案以显示可播放的版本,我会很乐意接受它。
  • @Aurelius 对,我刚刚在上面的代码行中添加了缺少的 -&gt;multitoken() 说明符。
  • 这不是未定义的行为吗?您正在向namespace std 添加方法。您可以添加到std 的唯一内容是模板专业化,并且仅适用于您自己的方法。而且您可能不需要在 std 中定义它,因为始终会搜索全局命名空间。
猜你喜欢
  • 2019-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
相关资源
最近更新 更多