C++17使用std::optional表示一个可能存在的值

2023-05-16

文章目录

  • 前言
  • 返回一个bool值
  • 使用 std::optional 改写
  • 总结

前言

平时写代码会遇到一种传递参数特殊值标记特殊流程,或者函数返回值存在魔法数的情况,很需要一种标记参数或返回值状态的结构,那么在 C++17 标准下提供了 std::optional 这个模板类,可以表示一个值不存在的状态,一起来看看用法吧。

返回一个bool值

以下例子纯属虚构,只为说明问题,无实际意义

bool getBoolVal(int a, int b)
{
    int* n = new int;
    if (!n)
        return false;

    *n = 1;

    if (a + *n > b)
        return true;
    else
        return false;
}

int main()
{
    if (getBoolVal(10, 9))
        std::cout << 1 << std::endl;
    else
        std::cout << 1 << std::endl;

    return 0;
}

这个例子中的函数 getBoolVal 本意是想返回一个 bool 类型的判断结果,但是函数中有一些异常情况时,比如申请内存异常时,也会返回一个bool值,这是与原判断结果语义不同的,所以需要单独返回这种情况,如果也放到同一个返回值中会导致含义模糊,这时可以考虑使用引用变量参数来返回实际比较结果。

bool getBoolVal(int a, int b, bool& ret)
{
    int* n = new int;
    if (!n)
        return false;

    *n = 1;

    if (a + *n > b)
        ret = true;
    else
        ret = false;

    return true;
}

int main()
{
    bool ret = false;
    if (getBoolVal(10, 9, ret))
        std::cout << "error" << std::endl;
    else
    {
        if (ret)
            std::cout << 1 << std::endl;
        else
            std::cout << 0 << std::endl;
    }

    return 0;
}

这个引用参数 ret 使用起来有点不方便,那把两个值都返回怎么样,虽然C++不允许有多个返回值,但可以把它们包装成 std::pair 或者 std::tuple 来返回,再来改写一下:

std::pair<bool, bool> getBoolVal3(int a, int b)
{
    int* n = new int;
    if (!n)
        return {false, false};

    *n = 1;

    if (a + *n > b)
        return {true, true};
    else
        return {true, false};
}

int main()
{
    auto [err, ret] = getBoolVal(10, 9);
    if (err)
        std::cout << "error" << std::endl;
    else
    {
        if (ret)
            std::cout << 1 << std::endl;
        else
            std::cout << 0 << std::endl;
    }

    return 0;
}

这种方法把实际的返回值,搭配一个表示状态的 bool 变量,组成 std::pair 进行返回,基本上得到而来语义明确的目的,但是看起来还是不太优雅,而 std::optional 可以帮助我们实现类似的需求,并且代码看起来能更简洁一点。

使用 std::optional 改写

std::optional 本身是一个模板类:会有一个 std::nullopt

template <class T>
class optional;

它内部有两种状态,要么有一个T类型的值,要么用 std::nullopt 表示没有值,查看一个 std::optional 对象是否有值,可以用 has_value() 进行判断,当一个 std::optional 有值时,可以通过用指针的方式(*号和->号)来使用它,或者用 value()函数取它的值,下面我们用它来改写一下之前的实现:

std::optional<bool> getBoolVal4(int a, int b)
{
    int* n = new int;
    if (!n)
        return std::nullopt;

    *n = 1;

    if (a + *n > b)
        return true;
    else
        return false;
}


int main()
{
    std::optional<bool> ret = getBoolVal(10, 9);
    if (ret.has_value())
        std::cout << "error" << std::endl;
    else
    {
        if (ret.value())
            std::cout << 1 << std::endl;
        else
            std::cout << 0 << std::endl;
    }

    return 0;
}

使用了 std::optional 之后就把 bool 类型之前的两态变成了三态,很多类似的逻辑也被封装成了函数,使用它之后代码更清晰了,从此可以告别一些烦人的魔法数了,一些函数参数也可以使用 std::optional 来包装,用法类似,在此就不展开说了。

总结

  • std::optional 是一个模板类,可以表示一个可能存在的值
  • std::optional 的内部有两种状态,要么表示一个T类型的值,要么用 std::nullopt 表示没有值
  • 可以用 has_value() 判断一个 std::optional 是否有值,然后用 value() 函数取它表示的值

==>> 反爬链接,请勿点击,原地爆炸,概不负责!<<==

子未经历过,安知此文是鸡汤,子非我,安知我不知此文是鸡汤。意见向左的人往往在内心互道傻X,而现实生活中哪有什么绝对的对错,只是出发点和眼界不同罢了,即使是真理也有适用的环境,“两点之间线段最短”,这一定是对的吗?

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

C++17使用std::optional表示一个可能存在的值 的相关文章

随机推荐

  • 强化学习Q-learning入门教学

    1 问题描述 2 图形化展示 3 reward矩阵构建 4 Q表构建 这里需要说明的是Q表的转移规则原本是 xff1a 本例中为了方便介绍 xff0c 将 值设为1了 原文讲解的通俗易懂 xff0c 有兴趣的可以看一下 出处 xff1a h
  • 英文文献代码查找

    原文链接 xff1a https blog csdn net weixin 45656790 article details 109271019
  • Word中插入集合和元素的包含符号

    1 比较简单 xff0c 是元素和集合的包含关系 查找 xff1a word gt 插入 gt 符号栏下拉 xff0c 选择基础数学 2 集合间的包含关系 四个数字 xff0c 代表一个 输入文档中的指定位置 xff0c 选中数字以后 xf
  • 微信PC端聊天界面表情包无法显示

    我试成功的一个办法 xff0c 分享一下 具体步骤 xff1a 1 找到微信聊天界面的设置选项 xff0c 如图 2 进入微信文件保存位置 3 进入WeChat Files All Users config目录 4 删除config dat
  • MathType 提示需要一个新版本的MT Extra(True Type)字体

    1 打开C Windows Fonts文件夹 xff0c 若里面有MT Extra TrueType 字体或其快捷方式 xff0c 则将其删除 2 找到MathType安装目录下C Program Files x86 MathType Fo
  • Word快捷键设置上下标;Word取消表格虚线;Word查找数学符号

    问题1 快捷键设置上下角标 这个在论文写作时比较常用 xff0c 本人也是最近在写大论文 xff0c 遇到了这个情况 Word和Visio中 xff0c 都可以使用 步骤 xff1a 选中即将成为上下标的内容 xff0c 上标快捷键 xff
  • xcode中xib使用之轻松学习

    1 创建xib文件 在工程目录中New Files xff0c 选择user interface类型中的empty创建一个空的interface builder document文件 文件名没有强制的要求 xff0c 最好使用 前缀 xff
  • 用Opencv打造一台自动视觉目标跟踪系统

    平移 倾斜伺服装置 xff0c 帮助摄像机使用视觉自动跟踪颜色对象 简介 现在我们将使用我们的设备帮助相机自动跟踪颜色对象 xff0c 如下所示 xff1a OpenCV可免费用于学术和商业用途 它具有C 43 43 xff0c C xff
  • error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools"【转载+修改】

    error Microsoft Visual C 43 43 14 0 is required Get it with Microsoft Visual C 43 43 Build Tools http landinghub visuals
  • 如何使用OpenCV实现多张图像拼接

    先来看看OpenCV官方的例子得到效果是非常的好 xff0c 输入的images如下 xff1a 效果 xff1a Stitcher类与detail命名空间 OpenCV提供了高级别的函数封装在Stitcher类中 xff0c 使用很方便
  • 如何使用OpenCV对物体进行搜索检测与识别

    在本教程中 xff0c 我们将了解对象检测中称为 选择性搜索 的重要概念 我们还将用C 43 43 和Python共享OpenCV代码 物体检测与物体识别 对象识别算法识别图像中存在哪些对象 它将整个图像作为输入 xff0c 并输出该图像中
  • 一种基于深度学习的方法来检测摩托车头盔的使用

    背景 据统计使用摩托车头盔可以将道路交通事故中摩托车驾驶员致命伤害的可能性降低42 xff05 xff0c 尽管如此 xff0c 遵守摩托车头盔还是较少 xff0c 尤其是在发展中国家 xff0c 为了有效开展针对性的头盔使用运动 xff0
  • 偏振光相机1——偏振光

    光的电磁波属性 光是一种电磁波 xff0c 这个概念大家应该不陌生 既然是电磁波 xff0c 那我们从电磁波的特性上来看它有哪些属性 用图1中的交变电磁场来描述光的特性 xff0c 电场和磁场在空间中相互垂直 xff0c 它们同时与光的传播
  • 偏振光相机2——索尼大法

    Stokes参量 在上一篇 偏振光相机 偏振光 中 xff0c 我们知道偏振光有线性偏振光 椭圆偏振光 圆偏光 那么如何定量的描述偏振光呢 xff1f Stokes矢量是一种广泛用来描述偏振光属性的方法 图1 不同类型的偏振光 线性偏振光和
  • 偏振光相机3——偏振应用

    在之前的2篇中 xff0c 介绍了偏振光的基本概念和基于SONY最新CMOS偏振传感器芯片的相机 在本篇中 xff0c 我们来看看偏振相机的一些应用 偏振相机的应用离不开偏振光 xff0c 那么先看看如何得到偏振光信息 如何获取偏光 在 偏
  • 【干货】生成对抗网络GANs算法在医学图像领域应用总结

    Goodfellow等人 介绍了生成对抗网络 xff08 GAN xff09 以模拟数据分布 由于与两个基本属性相关的原因 xff0c GAN可以合成真实图像 GAN是一种无监督的训练方法 xff0c 可以通过类似于人类学习图像特征的方式获
  • 图像算法之3D人脸识别技术原理概述

    随着深度学习技术的进步 xff0c 面部相关任务的研究也成为学术界和工业界的热门话题 众所周知的面部任务通常包括面部检测 xff0c 面部识别 xff0c 面部表情识别等 xff0c 其主要使用2D RGB面部 xff08 通常包括一些纹理
  • 如何使用OpenCV计算机视觉检测帕金森病图片

    在本教程中 xff0c 您将学习如何使用OpenCV和机器学习在手绘的螺旋和波浪图像中自动检测帕金森病 本教程来自来自巴西的博士生Joao Joao有兴趣利用计算机视觉和机器学习基于几何图形 xff08 即螺旋和符号波 xff09 自动检测
  • OpenCV快速寻找图像差异

    如何使用结构相似性指数 xff08 SSIM xff09 将两个图像与Python进行比较 使用这种方法 xff0c 我们能够轻松确定两个图像是否相同或由于轻微的图像处理 xff0c 压缩伪像或有目的的篡改而产生差异 今天我们将扩展SSIM
  • C++17使用std::optional表示一个可能存在的值

    文章目录 前言返回一个bool值使用 std optional 改写总结 前言 平时写代码会遇到一种传递参数特殊值标记特殊流程 xff0c 或者函数返回值存在魔法数的情况 xff0c 很需要一种标记参数或返回值状态的结构 xff0c 那么在