【问题标题】:C++ convert boost::optional<double> to doubleC++ 将 boost::optional<double> 转换为 double
【发布时间】:2015-02-07 16:15:20
【问题描述】:

在 C++ 中是否可以将 boost::optional 转换为 double?

I.E.

boost::optional<double> time;
double realTime;

realTime = time;

最后一行给了我一个错误,我

"Assigning to 'double' from incompatible type boost::optional<double>"

【问题讨论】:

  • 从文档开始,这就是文档的用途:boost.org/doc/libs/master/libs/optional/doc/html/boost_optional/…
  • 那么,当time 不是double 时,您希望发生什么? (optional&lt;double&gt; 可能是双重的,可能什么都不是)。
  • @Yakk:零似乎是一个合理的替代物。
  • @RobertHarvey 什么,不是NaN?哎呀,在某些情况下,-inf+inf 是合理的(例如,累积最大值或最小值)。我的观点是,你需要回答这个问题,并在你这样做的时候思考它。在某些情况下,任何默认值都会很糟糕。
  • @Yakk:NaN 会起作用,尽管我认为这在某些情况下会出现问题。无论如何,这是一个有损转换;任何选择都将是某种妥协。

标签: c++ boost double optional


【解决方案1】:

当然是,但你需要检查是否给出了time

if (time){
    /*this means that the optional parameter was provided*/
    realTime = *time;
}

Boost 使用 dereference 运算符从可选项中提取值,并使用更多运算符重载技巧使 if (time) 成为“提供性”的令人满意的测试。

【讨论】:

  • 很好,可以编译!我确实检查了时间是否存在 - if (time) 但我没有意识到指针可以编译。现在开始测试!
  • 但是请阅读文档。非常全面,甚至告诉你optional是如何实现的。
  • 我确实阅读了一天的文档和网络。当然,我没有阅读所有内容,所以我将继续阅读。我问这个问题是为了了解它是否可能。谢谢!
【解决方案2】:

如果您知道要将time 设置为什么值,如果optional 缺失,opt.get_value_or(3) 将返回opt 的值,如果它没有值,它将返回3

这很危险,因为大多数默认值都有问题(03NaN+inf-inf 都值得考虑。3 因为至少它不是其中之一其他人。)

一旦你知道可选有一个值,.get() 或一元operator* 将提取它。在布尔上下文中评估 optional&lt;?&gt; 会告诉您它是否为空。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2016-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多