我应该对最简单的类型使用boost :: optional来表示nullable int double等吗?

时间:2014-04-23 18:36:51

标签: c++ boost

我需要nullable double和int。在C#中我可以使用double?int?,在C ++中我们似乎只有boost::optional。然而,似乎boost:optional并不支持很多事情,而且开箱即用#34;例如我can't easily devide variables

这就是为什么我要问在这么简单的情况下使用boost::optional是否一个好主意?我正在编写延迟关键代码,所以我要彻底选择技术。

如果boost::optional<double>与原始double + boolean进行比较,则为:

  • 显着慢了?
  • 误差phrone?
  • 不太可读和可维护?
  • 其他问题?

upd 我意识到我可以使用double + isnan()。我可以使用nan代替bool字段。

2 个答案:

答案 0 :(得分:3)

你选择。使用T + bool是:

  • 显着慢了吗?

    • 不一定。实际上,在极少数情况下,可选项可能会更慢。这一切都取决于内存布局和访问模式,因此除了通常的配置文件,配置文件,配置文件咒语之外没有太多其他内容。
  • 错误phrone?

    • 是的,它客观上更容易出错,因为忘记检查bool会更容易,或者忘记在重置时更新bool
  • 不太可读和可维护?

    • 是的,它的可读性较差,因为typename不能使意图明确
    • 是的,它的可维护性较差,因为更改/移动/重命名变量需要修改两个变量而不是一个。
      示例:用例如optional<T>替换unique_ptr<T> T*(甚至null)是微不足道的(因为none / bool+T - 检查使用相同的语法),但是,替换std::vector<bool>并不简单替代演习。
  • 其他问题?

    • 优化。可选的,可以针对不使用所有容量的T进行优化
    • 相反,std::vector<T> + std::vector<optional<T>>可能比{{1}}更有效(存储方式);运行时可能会变慢,具体取决于使用模式。 (个人资料,个人资料,个人资料

TL; DR:首先是正确性,稍后优化

如果你想要提升算术运算,只需要强类型为它设置可选和重载运算符。

答案 1 :(得分:2)

boost::optional将是我在C ++中采用的正常方法。

似乎可以肯定地说,与double + bool boost::optional相比,应该更不容易出错且更具可读性。至于性能,唯一可以确定的方法是在用例中分析两种方式,看看哪种方式更快。请记住boost::optional支持就地构造,我怀疑它提供的功能几乎没有开销。

简要说明你对分词的评论,C ++是一种强类型语言,并且在许多情况下不允许从一种类型到另一种类型的隐式转换。您需要告诉语言您的意图是什么,这样可以让您编写更清晰的代码,甚至可以提高其稳健性。