限制 boost::options_description 中默认值的 std::cout 精度
当我构造一个 boost::options_description 实例时,例如,
options.add_options()
("double_val", value(&config.my_double)->default_value(0.2), "it's a double");
稍后想要自动输出可用于我的程序的选项,并
std::cout << options << std::endl;
以太高的精度显示默认值 0.2 ,这实际上会在我有时使我的输出变得混乱长变量名:
--double_val (=0.20000000000000001) it's a double
不幸的是,之前对 std::cout. precision 的调用没有帮助:
cout.precision(5);
std::cout << options << std::endl;
这仍然导致相同的输出:/
您对如何将默认值的显示限制在更少的位置有什么想法吗?
此致, 基督教
When I construct a boost::options_description instance like
options.add_options()
("double_val", value(&config.my_double)->default_value(0.2), "it's a double");
and later want to have the automated output of the options that are available for my program, and put
std::cout << options << std::endl;
the default value 0.2 is shown with way too high precision, which effectively clutters my output when I have long variable names:
--double_val (=0.20000000000000001) it's a double
unfortunately, a prior call to std::cout.precision did not help:
cout.precision(5);
std::cout << options << std::endl;
this leads still to the same output :/
Do you have any ideas on how to limit the display of the default value to less positions?
Best regards,
Christian
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
来自boost/program_options/value_semantic.hpp:
所以实现非常简单(Boost 从来都不是确定的事情!)。尝试重新配置 ostream 以使格式按照您想要的方式显示是行不通的,因为默认值只是转换为独立
ostringstream
中的字符串(在lexical_cast
内) )。因此,一个简单的解决方法是将所需的字符串表示形式添加为
default_value
的第二个参数。然后你可以让它按照你想要的方式打印(包括根本不打印,如果你传递一个空字符串)。像这样:完成同样事情的更“企业”方法是实现您自己的类型,该类型将包装
double
,用于config.my_double
,并提供构造from 并强制转换为double
,以及您自己的ostream&运算符<<
与您想要的格式完全相同。但是,我不建议使用这种方法,除非您正在编写一个需要通用性的库。来自 Boost Lexical Cast 的注释:
From
boost/program_options/value_semantic.hpp
:So the implementation is dead simple (never a sure thing with Boost!). Trying to reconfigure your ostream to make the formatting come out as you want won't work, because the default value just gets converted to a string in a standalone
ostringstream
(insidelexical_cast
).So a simple workaround is to add your desired string representation as a second argument to
default_value
. Then you can make it print however you want (including not at all, if you pass an empty string). Like so:The more "enterprisey" way to accomplish the same thing would be to implement your own type which would wrap
double
, be used forconfig.my_double
, and provide construction from and coercion todouble
, and your very ownostream& operator<<
with exactly the formatting you desire. I don't suggest this approach, however, unless you're writing a library that demands generality.From the Boost Lexical Cast notes:
为了避免手动引用:
To avoid having to quote by hand: