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

2024-01-28

明显地,std::optional如果使用 C++17 或 boost,则这是从函数返回可选值的最佳选择(另请参阅GOTW #90 http://herbsutter.com/2013/05/30/gotw-90-solution-factories/)

std::optional<double> possiblyFailingCalculation()

但是,如果用户坚持使用旧版本(并且无法使用 boost),那么什么以及为什么是最好的替代方案呢?

我看到几个选项:

  1. STL智能指针(仅限 C++11)

    std::unique_ptr<double> possiblyFailingCalculation();
    
    • (+) 与可选的用法几乎相同
    • (−) 指向非多态类型或内置类型的智能指针会造成混淆
  2. 将其与 bool 配对

    std::pair<double,bool> possiblyFailingCalculation();
    
  3. 老式

    bool possiblyFailingCalculation(double& output);
    
    • (−) 与新的 C++11 不兼容auto value = calculation() style
  4. DIY 模板:具有相同功能的基本模板很容易编写代码,但是实现健壮的模板是否存在任何陷阱std::optional<T>看起来很像的模板?

  5. 抛出异常

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

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从方法返回可选值的 std::Optional 的最佳替代方案? (使用C++98/C++11/C++14) 的相关文章

随机推荐

  • Java 中 JTable 的 JDBC TableModel?

    我想将数据库表显示为 JTable 我以前从未使用过 JTable 所以我用 google 搜索了 JTable 和 TableModel 通过谷歌搜索 我可以编写自己的自定义 TableModel 它显示存储在中的数据 Object da
  • 如何在 android 中使用 java 8 库?

    我正在尝试在我的 android 项目中使用一个使用 java 8 的库 我无法找到一种方法来完成这项工作 我尝试过使用复古 lambda 但没有帮助 我不断收到错误 com android dx cf iface ParseExcepti
  • acosf() 返回 NaN

    我有一个用 Objective C 编写的 iPhone 应用程序 我在其中收集用户在屏幕上绘制的触摸点以创建路径 我希望能够精简这些数据 我的目标之一是检查点的角度是否超过某个阈值 例如 如果我在名为 a b c 的线上取任意三个相邻点
  • AngularJS 路由参数可以包含任意字符

    我是 AngularJS 的新手 所以如果这是显而易见的 请原谅我 但我正在寻找可以回答这个棘手问题的人 我正在实现一个应用程序 需要将一些参数传递到特定视图以显示有关书籍的详细信息 基本上我希望能够使用以下路由表达式 bookApp co
  • 我想知道缩放和轨道运行出了什么问题

    我希望能够平移 缩放和绕立方体旋转 我想知道为什么立方体在屏幕上显示为完全缩放 以至于我必须向后移动才能查看整个立方体 我还想将缩放控件更改为 Alt 和鼠标右键以进行缩放和轨道旋转 但我无法让它工作 任何援助将不胜感激 header in
  • 无法将数据类型 nvarchar 转换为 float 时出错

    我搜索了这个很棒的论坛并用谷歌搜索 但无法解决这个问题 我们有两张桌子 相信我 我与这些桌子无关 两个表都有一个名为eventId 然而 在一张表中 数据类型为eventId is float在另一个表中 它是nvarchar 我们正在选择
  • VBA 尝试和捕获 (MS Outlook)

    我使用以下函数来监视公共 Outlook 文件夹是否有新电子邮件到达 Public Sub Application Startup Set NewMail Application GetNamespace MAPI Folders 3 Fo
  • 为什么 SVG 滚动性能比 PNG 差这么多?

    我正在开发的一个网站在滚动对话框窗口中显示大量 gt 50 复杂的 SVG 图像 在 Chrome 中查看网站时 对话框窗口的滚动性能非常差 明显滞后且缓慢 但是 如果我用 PNG 图像替换 SVG 图像 滚动将非常平滑且响应灵敏 这是差异
  • 在 Python 中绘制 3D 边界决策

    我正在尝试绘制 3D 决策边界 但它似乎并不像看起来那样工作 看看它是怎样的 我希望它像本例中那样显示 我不知道如何解释 但在上面的例子中 它实际上看起来像一堵 墙 这就是我想在我的代码中做的事情 然后按照我的代码 fig plt figu
  • Java发送midi消息到设备

    我有一个连接到树莓派的 APC40 MkII 在 pi 上 我正在运行 java 使用 java sound midi 包 我可以毫无问题地建立与 APC 的连接并接收其 midi 消息 但经过大量研究后 我仍然不明白如何向 APC 发送
  • Webactivator 无法在 IIS 7 上运行

    我有几个使用 WebActivator 来使用包的 Web 应用程序 在装有 IIS 7 5 Express 的本地计算机上 无论我在发布配置还是调试配置中进行测试 一切都正常 但是 在装有 IIS 7 5 的生产计算机上 WebActiv
  • 如何使用 jQuery 将文本添加到特定的 div 元素?

    我在使用 jquery 时遇到了问题 我的 HTML 是 div span class test span div div span class test span div 现在我尝试使用 Jquery 在 span 中添加文本 j spa
  • PostgreSQL 数据库服务

    我从他们的网站下载了 PostgreSQL http www postgresql org download windows http www postgresql org download windows 但是 我无法从中创建数据库pgA
  • MySQL:更新语句中等号冒号 =: 是什么意思?

    我遇到了以下 MySQL 查询 update table set itemId itemId startDate startDate where id id 但是我无法弄清楚 是什么意思 我认为 后面的名称是一个变量 但是如何检查里面有什么
  • Maven 替换器:替换值包含美元符号

    我正在处理一个 Maven 脚本 我必须修改一些文件内容 我目前正在使用替换插件 当替换值包含美元符号时 这会给我带来麻烦 我遇到问题的替换相对简单 在我的 log4j xml 中 替换该行
  • Kubernetes PVC删除POD的内容

    我有一个正在运行的 Kubernetes POD 并且已将 PVC 附加到它 PVC 卷为 opt stackstorm 默认情况下 opt stackstorm 中有一些文件 它们是 docker 官方镜像的一部分 当没有 PVC 连接到
  • 结构体是否可以序列化[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我可以序列化一个struct直接输入 因为它是值类型 我在课堂上使用过它 但想知道它是否可以单独用于结构 e g str
  • 挂锁的 Unicode 字形

    我需要使用看起来像挂锁的 unicode 字符 它用于表单下方的一个按钮 上面写着 CopyLink 上面有一个挂锁 表明当他们复制所在页面的链接时 访问该页面的 copylink 版本的人将不会被访问 能够修改表格 无论如何 我环顾四周
  • API 来确定手机运营商? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 是否有免费的 API 或其他方式来确定手机号码注册的运营商 我希望我的应用程序能够广播短信 而无需他们从列表中选择运营商 UPDATE 有
  • 从方法返回可选值的 std::Optional 的最佳替代方案? (使用C++98/C++11/C++14)

    明显地 std optional如果使用 C 17 或 boost 则这是从函数返回可选值的最佳选择 另请参阅GOTW 90 http herbsutter com 2013 05 30 gotw 90 solution factories