Aur*_*ius 5 c++ boost-program-options
我有一个boost :: program_options选项,可以将所需的输入选项成功解析为向量,但是我没有看到如何为它提供默认值。例:
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description");
Run Code Online (Sandbox Code Playgroud)
可以很好地将值读入vecoptions之类的东西
base.add_options()
("int_value",po::value<int>(&intoption)->default_value(1),"description");
Run Code Online (Sandbox Code Playgroud)
也可以正常工作,但是尝试为vector参数赋予默认值,例如in
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description");
Run Code Online (Sandbox Code Playgroud)
给出编译器错误
错误:静态断言失败:源类型既不是std :: ostream`able也不是std :: wostream`able
如何创建具有默认值(如{0,1,2})的向量值float选项?
问题造成的错过operator<<了ostream该类型std::vector<double>。该运算符需要提供默认值的文本表示形式。在boost\program_options\value_semantic.hpp标题中,您可以找到有关此要求的注释:
/ **指定默认值,如果未明确指定则使用默认值。类型“ T”应为ostream提供operator <<。* /
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;
}
}
Run Code Online (Sandbox Code Playgroud)
Boost可以解析operator<<如果它是在namespace中定义的std。在这种情况下,可以指定默认参数值,例如:
("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}), "description");
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用具有显式文本值规范的方法:
("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}, "0, 1, 2"), "description");
Run Code Online (Sandbox Code Playgroud)