11

当我构造一个 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;

这仍然导致相同的输出:/

您对如何将默认值的显示限制为更少的位置有什么想法吗?

最好的问候,克里斯蒂安

4

2 回答 2

11

来自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)
    {
        m_default_value = boost::any(v);
        m_default_value_as_text = boost::lexical_cast<std::string>(v);
        return this;
    }

    /** Specifies default value, which will be used
        if none is explicitly specified. Unlike the above overload,
        the type 'T' need not provide operator<< for ostream,
        but textual representation of default value must be provided
        by the user.
    */
    typed_value* default_value(const T& v, const std::string& textual)
    {
        m_default_value = boost::any(v);
        m_default_value_as_text = textual;
        return this;
    }

所以实现非常简单(Boost 从来都不是确定的事情!)。尝试重新配置您的 ostream 以使格式按照您的意愿出现是行不通的,因为默认值只是被转换为独立ostringstream(内部lexical_cast)中的字符串。

因此,一个简单的解决方法是将所需的字符串表示形式作为第二个参数添加到default_value. 然后你可以让它打印你想要的任何东西(包括根​​本不打印,如果你传递一个空字符串)。像这样:

value(&config.my_double)->default_value(0.2, "0.2")

完成同样事情的更“企业”的方式是实现您自己的类型,该类型将 wrap double、用于config.my_double、并提供构造 from 和强制 to double,并且您自己ostream& operator<<的类型完全符合您想要的格式。但是,我不建议使用这种方法,除非您正在编写一个需要通用性的库。

来自 Boost Lexical Cast 笔记:

以前版本的 lexical_cast 使用默认的流精度来读取和写入浮点数。对于具有相应的 std::numeric_limits 特化的数字,当前版本现在选择一个精度来匹配。

于 2009-11-14T23:58:14.170 回答
3

为避免手动引用:

#define QUOTE(x) #x
#define stringize(x) QUOTE(x)

#define MY_DOUBLE_DEFAULT 0.2

value(&config.my_double)->default_value(MY_DOUBLE_DEFAULT, stringize(MY_DOUBLE_DEFAULT))
于 2012-07-19T05:29:33.420 回答