向量赋值boost :: program_options的默认值
问题描述:
我有一个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>
类型错过operator<<
为ostream
造成的问题。该操作员需要提供您的默认值的文本表示。在boost\program_options\value_semantic.hpp
头,你可以找到有关此规定的评论:
/** 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;
}
}
加速能够解决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");
无关,但你并不需要显式提供模板参数'婆:: value'。只需'po :: value(&intoption)'和'po :: value(&vecoption)'就可以了。这是一个函数模板。 – Barry