应该如何使用 std::Optional?

2024-03-01

我正在阅读以下文档std::experimental::optional http://en.cppreference.com/w/cpp/utility/optional我很清楚它的作用,但我不明白when我应该使用它或者我应该如何使用它。该网站尚未包含任何示例,这使我更难掌握该对象的真正概念。什么时候std::optional这是一个很好的选择,它如何弥补以前标准 (C++11) 中未找到的内容。


我能想到的最简单的例子:

std::optional<int> try_parse_int(std::string s)
{
    //try to parse an int from the given string,
    //and return "nothing" if you fail
}

可以使用引用参数来完成同样的事情(如下面的签名所示),但是使用std::optional使签名和使用更好。

bool try_parse_int(std::string s, int& i);

另一种方法可以做到这一点是特别糟糕:

int* try_parse_int(std::string s); //return nullptr if fail

这需要动态内存分配,担心所有权等 - 总是更喜欢上面的其他两个签名之一。


另一个例子:

class Contact
{
    std::optional<std::string> home_phone;
    std::optional<std::string> work_phone;
    std::optional<std::string> mobile_phone;
};

这比使用类似的东西要好得多std::unique_ptr<std::string>对于每个电话号码!std::optional为您提供数据局部性,这对性能非常有用。


另一个例子:

template<typename Key, typename Value>
class Lookup
{
    std::optional<Value> get(Key key);
};

如果查找中没有某个键,那么我们可以简单地返回“无值”。

我可以这样使用它:

Lookup<std::string, std::string> location_lookup;
std::string location = location_lookup.get("waldo").value_or("unknown");

另一个例子:

std::vector<std::pair<std::string, double>> search(
    std::string query,
    std::optional<int> max_count,
    std::optional<double> min_match_score);

这比拥有四个函数重载(这四个函数重载采用所有可能的组合)更有意义max_count(或不)和min_match_score(或不)!

It also 消除 the accursed "Pass -1 for max_count如果您不想要限制”或“通过std::numeric_limits<double>::min() for min_match_score如果你不想要最低分数”!


另一个例子:

std::optional<int> find_in_string(std::string s, std::string query);

如果查询字符串不在s,我想要“不int" -- not无论某人决定为此目的使用什么特殊值(-1?)。


有关其他示例,您可以查看boost::optional 文档 http://www.boost.org/doc/libs/release/libs/optional/doc/html/index.html. boost::optional and std::optional在行为和使用方面基本上是相同的。

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

应该如何使用 std::Optional? 的相关文章

随机推荐

  • 无法在 Android 上选择多个图像上传 - Chrome 网络浏览器

    我想创建一个网络应用程序 用户可以从手机的图片库中选择并上传多个图像 这个功能在iOS上运行良好 但在Android上似乎被破坏了
  • JBoss 4:在哪里部署全局过滤器?

    我想使用 全局 HTTP 过滤器 因此 我编辑了deploy jboss web deployer conf web xml并补充道
  • 模拟Winforms按钮点击动画

    我有一个按钮 按钮内有一个图像控件 当用户单击图像时 我想为按钮设置动画 以便看起来按钮被按下 我并不真正关心实际的按钮按下事件是否触发 这是我想看到的按钮按下的幻觉 注意 我在网上看到的唯一选项涉及直接写入 Windows API 我真的
  • 如何根据简单的多边形绘制图像?

    我想将一个大致矩形区域复制到一个矩形区域 例子 两个区域均由其角点定义 保持大体方向 不翻转等 简单地旋转源图像是行不通的 因为相对边的长度可能不同 到目前为止 我发现没有办法在纯 C 中做到这一点 手动像素复制除外 所以我想我必须求助于
  • 在java中创建指定名称的临时文件

    我有一个 Byte 数组 我想将其内容放入临时文件中 我尝试这样做 try tempFile File createTempFile tmp null FileOutputStream fos new FileOutputStream te
  • 调试时从数据行获取所有列名/列值

    我正在创建一个数据行的模拟实例以进行测试 我尝试从数据库中复制的行包含 37 列 其中包含不同的变量 调试时是否有机会以干净的文本形式获取信息 以便简单地编辑我的模拟对象 我必须调整尼基尔的演员阵容 var colNames dr Tabl
  • 使用 C# 确定谁打开了文件

    使用 C 如何获取有关谁打开了文件的信息 用户名和机器名就足够了 以防万一 我有 Windows 工作站通过 Samba 访问 Linux 文件服务器上的文件 我在工作站上运行的程序中需要此信息 核心 NET 库没有任何方法可以做到这一点
  • 访问指针指向的整数数组时,“sizeof”对不完整类型“int[]”的无效应用

    我正在尝试学习 C 中的指针 并正在编写这个小整数数组指针练习 但遇到了无效的应用程序sizeof不完整类型int 问题 请告诉我哪里出了问题以及如何解决 谢谢 include
  • 在非标准位置安装带有库的 sf 包

    所需的库位于非标准位置 我可以通过以下命令安装 rgdal install packages rgdal type source configure args c with gdal config home programs anacond
  • 您会使用 实现轻量级 XML 解析器吗?

    如果您必须实现一个轻量级 XML 解析器 您会选择使用正则表达式吗 在我的例子中 XML 解析是最简单的 只有标签和文本内容 没有命名空间 没有属性 没有模式支持 当然是在一开始 但也许 我认为学习新的 C 0x 库对我来说是一个很好的练习
  • 将日期中的 NA 替换为另一个日期

    Data DB1 lt data frame orderItemID 1 10 orderDate c 2013 01 21 2013 03 31 2013 04 12 2013 06 01 2014 01 01 2014 02 19 20
  • WAMP服务器呈绿色但只得到404

    好吧 女士们先生们 我有一个很令人困惑的问题 我在工作中的 WIN7 机器上安装了 WAMP 服务器 一切都工作正常 有几个星期没有使用它 因为我被其他事情吸引了 有一天 我尝试启动它 图标是绿色的 我认为我们做得很好 然后我尝试打开 lo
  • 邮件脚本 - 解析错误:语法错误,意外的“=”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试从包含下拉列表的 html 表单设置一个简单的邮件脚本 但在声明所选变量的行上我收到一条错误消息 解析错误 语法错误 意外的 我
  • 如何手动解密 EncryptedAssertion

    我想解密 EncryptedAssertion 我尝试使用 OpenSaml Decrypter 但它对我不起作用 我无法解密 EncryptedData 我已经问过这个问题了 EncryptedAssertion 解密失败 https s
  • Selenium:遍历元素列表

    我正在使用 XPath CSS 和 Selenium 来定位网站上的元素 我想创建一种方法 在该方法中迭代定位器列表 XPath CSS 程序选择有效的一个 换句话说 它从定位器一开始 如果定位器存在 则返回 true 并存在循环 否则 它
  • winHTTP GET 请求 C++

    我就开门见山吧 这就是浏览器请求的样子 获取 index html HTTP 1 1 这就是 winHTTP 的作用 GET http site com index html http site com index htmlHTTP 1 1
  • Java用户类

    如何解析java用户类和JDBC用户类 问题是当我用完 put 时 sql 中有数据 例如 public User authenctication String eMail String password try con DriverMan
  • String 是关于 switch 的数字类型并且总是编译为 LookupSwitch 吗?

    以下代码返回是否给定String s等于任何其他硬编码字符串 该方法使用switch 这样做的声明 public class SwitchOnString public static boolean equalsAny String s s
  • 在 Laravel 中使用自动控制器路由是一个坏主意

    我从 CodeIgniter 转到 Laravel 那么 使用自动路由到所有控制器是一个坏主意吗 Route controller Controller detect 我应该使用它而不是在routes php 中创建路由吗 是的 这很糟糕
  • 应该如何使用 std::Optional?

    我正在阅读以下文档std experimental optional http en cppreference com w cpp utility optional我很清楚它的作用 但我不明白when我应该使用它或者我应该如何使用它 该网站