当前位置: 首页 > 知识库问答 >
问题:

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

禄豪
2023-03-14

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

std::optional<double> possiblyFailingCalculation()

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

我看到一些选择:

>

  • STL智能指针(仅限C 11)

    std::unique_ptr<double> possiblyFailingCalculation();
    
    • ()几乎与可选的用法相同
    • (−) 使用指向非多态类型或内置类型的智能指针令人困惑

    把它和一个布尔配对

    std::pair<double,bool> possiblyFailingCalculation();
    

    旧式

    bool possiblyFailingCalculation(double& output);
    
    • (−) 与新的C 11不兼容auto value=calculation()style

    DIY模板:具有相同功能的基本模板很容易编码,但是实现健壮的std::optional有什么缺陷吗

    抛出异常

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

  • 共有3个答案

    令狐新翰
    2023-03-14

    使用此链接中的tl::optional,而不是std::optional:https://github.com/TartanLlama/optional

    它有相同的公共接口作为它的std对应,只是它编译在C 98也。

    我在生产代码(C11)中使用了它,效果非常好!

    陶超
    2023-03-14

    我也会考虑哨兵的价值。

    double的情况下,NaN值(std::numeric\u限制

    关于这种方法有各种不同的意见(例如,如果更喜欢使用-ffast-数学,请查看NaN或false作为双精度返回值,以及Good哨兵值作为双精度返回值)。

    在特定的领域中,可能有其他有意义的哨兵值。

    在任何情况下(不仅对于),我都会采用/实现类似于可标记的(https://github.com/akrzemi1/markable)的东西来避免神奇的值,并指示该值可能不存在,并且应该由用户

    了解此方法的其他动机和概述:有效的可选值。

    周越泽
    2023-03-14

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

    DIY选择绝对是首选。(1) 涉及分配,并且(2)、(3)涉及必须构造T,即使您想要空值-这对double根本不重要,但对更昂贵的类型却很重要。对于(5),异常不能替代可选的

    您可以随时将您的实现与Boost的实现进行比较。毕竟,它是一个只有标题的小库。

     类似资料:
    • 问题内容: 我正在尝试选择多个字段,其中一个字段需要是一个数组,该数组的每个元素都包含 两个 值。每个数组项都需要包含一个名称(字符不同)和一个ID(数字)。我知道如何返回单个值的数组(使用关键字),但是我不确定如何返回本身包含两个值的对象的数组。 查询就像 我读到一种实现此目的的方法是,将值选择为一个类型,然后创建该类型的数组。问题是,该函数的其余部分已经返回了一个类型(这意味着我将拥有嵌套的类

    • 问题内容: 这是一个小问题,因为我可以轻松地参加一对班做这项工作。我并不是真的想要这样做,我觉得应该有一些简单的,内置的,类似于Java的方法来返回两个值。你们最好的,最简单的方法是什么?数组?其他一些数据结构? 问题答案: 据我所知,不幸的是在Java中没有对的内置表示(我当然希望有)。就个人而言,当我编写一个项目时发现配对类经常很有用时,我会创建一个通用类(这可能是您在想的)。返回数组是一种快

    • 本文向大家介绍什么是方法的返回值?返回值在类的方法里的作用是什么?相关面试题,主要包含被问及什么是方法的返回值?返回值在类的方法里的作用是什么?时的应答技巧和注意事项,需要的朋友参考一下 方法的返回值是指我们获取到的某个方法体中的代码执行后产生的结果!(前提是该方法可能产生结果)。 返回值的作用: 接收出结果,使得它可以用于其他的操作!

    • 问题内容: 我正在使用模拟器玩掷骰子,并且试图从同一方法返回两个值(或者我想这样做)。 当我写我的return语句时,我只是尝试放入“&”,它可以编译并正常运行;但是我无法访问第二个返回值。 当我将值返回为: 它适当地设置了赢或输的变量,但是如果我尝试执行以下语句中的简单操作: 它被分配与gamestatus相同的值… 0或1(赢或输)。以任何方式可以访问第二个返回值?还是有完全不同的方法来解决?

    • 问题内容: 我有这样的对象: 现在我只想获取主题和ID。有没有办法像这样获得它: 因为即使只使用此查询 我只能得到这样的记录: 我不希望获得具有属性ID和主题的对象数组。实现这一目标的最好方法是什么? 问题答案: 在Spring Data JPA中,您可以使用投影: 基于接口 : 基于类 (DTO): 然后在您的仓库中创建一个简单的查询方法: 您甚至可以创建动态查询方法: 然后像这样使用它:

    • 问题内容: 这是我之前的问题的后续内容,我对此感到有些尴尬。但是无论如何:您将如何以独立于系统的方式从独立的Java程序中启动第二个JVM?而且,例如,在不依赖于诸如JAVA_HOME之类的env变量的情况下,它可能会指向与当前正在运行的JRE不同的JRE。我想出了以下代码,该代码实际上有效,但感觉有点尴尬: 另外,当前正在运行的JVM可能已使用第二个JVM不知道的其他一些参数(-D,-X …,…