I have a boost::program_options option that successfully parses the desired input options into a vector, but I'm not seeing how to also give it a default value. Example:
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description");
works fine to read values into vecoptions, and something like
base.add_options()
("int_value",po::value<int>(&intoption)->default_value(1),"description");
also works fine, but trying to give the vector argument a default value like in
base.add_options()
("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description");
gives a compiler error
error: static assertion failed: Source type is neither std::ostream`able nor std::wostream`able
How can I create a vector-valued float option with default values like {0,1,2}?
Problem caused by missed operator<<
for ostream
for the type std::vector<double>
. This operator required to provide textual representation of your default value. In the boost\program_options\value_semantic.hpp
header you can find a comment about this requirement:
/** 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)
To solve the problem you can specify operator<<
like:
namespace std
{
std::ostream& operator<<(std::ostream &os, const std::vector<double> &vec)
{
for (auto item : vec)
{
os << item << " ";
}
return os;
}
}
Boost is able to resolve the operator<<
if it's defined in the namespace std
. In this case default parameter value can be specified like:
("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}), "description");
The other approach is to use method with explicit textual value specification:
("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}, "0, 1, 2"), "description");
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With