std::optional 从方法返回可选值的最佳替代方案? (使用 C 98/C 11/C 14)

新手上路,请多包涵

显然, std::optional 如果使用 C++17 或 boost 从函数返回可选值的最佳选择(另见 GOTW #90

 std::optional<double> possiblyFailingCalculation()

但是,如果一个人坚持使用旧版本(并且不能使用 boost),那么最好的选择是什么,为什么是最好的选择?

我看到几个选项:

  1. STL 智能指针(仅限 C++11)
    std::unique_ptr<double> possiblyFailingCalculation();

  • (+) 与 optional 几乎相同的用法
  • (−) 对非多态类型或内置类型的智能指针感到困惑
  1. 与布尔配对
   std::pair<double,bool> possiblyFailingCalculation();

  1. 老式
   bool possiblyFailingCalculation(double& output);

  • (−) 与新的 C++11 auto value = calculation() 风格不兼容
  1. DIY 模板:具有相同功能的基本模板很容易编写代码,但是在实现强大的 std::optional<T> 类似模板时是否存在任何缺陷?

  2. 抛出异常

    • (−) 有时“无法计算”是一个有效的返回值。

原文由 mr_T 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 933
1 个回答

std::optional 与其 boost::optional 父级一样,是一个非常基本的类模板。它是一个 bool ,一些存储和一堆方便的成员函数,其中大部分是一行代码和一个断言。

DIY 选项绝对是首选。 (1) 涉及分配和 (2)、(3) 涉及必须构造一个 T 即使您想要一个空值 - 这对于 double 根本不重要,但确实对于更昂贵的类型来说很重要。对于 (5),例外不能替代 optional

您始终可以将您的实现与 Boost 的实现进行比较。毕竟,这是一个小型的仅标头库。

原文由 Barry 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题