C++中的 std::optional

   std::optional<T>是 C++17 中的一个标准库组件,optional <T>对象默认是空的,也就是处于无效状态,给它赋值后因为里面有了元素,就变成了有效状态。

1.引入背景

        c++函数常用返回值表示函数是否执行成功。如返回nullptr表示执行失败,反之则执行成功。或者返回-1表示执行失败,0表示执行成功。此时,如果函数在执行成功时,还需要传出执行结果,则只能使用函数的传出参数。

        我们需要有一种简单的概念,它能够将执行是否成功的标记与执行结果统一起来,这就是模板类 optional。

2.创建对象

        std::optional<T> 包含一个值时,它的行为就像一个普通的容器,可以访问和修改这个值。当它为空时,任何试图访问值的操作都会失败,通常是通过抛出一个异常或返回一个错误值。
        下面例子中,初始化optional<int>对象后,使用函数 has_value()检查是否包含值,使用函数value() 访问包含的值。

#include <iostream>
#include <optional>
using namespace std;
int main()
{optional<int> op1;               // 默认是无效值if (op1.has_value()){          cout << "op1 value = " << op1.value() << endl;}  optional<int> op2 = 10;                        // 赋值,持有有效值       if (op2.has_value()){          cout << "op2 value = " << op2.value() << endl;}    
}

   运行结果:

op2 value = 10

        optional也能够转换为 bool 值,可以用 */-> 来直接访问内部的值,行为表现很像指针。 

#include <iostream>
#include <string>
#include <optional>
using namespace std;
int main()
{optional<string> op {"c++ shell"};  if (op)                                  //可以转为bool值{          cout << "op value = " << *op << endl; // 使用*/->访问内部的值}    
}

  运行结果:

op value = c++ shell

  3.工厂函数  

        optional 也可以用工厂函数 make_optional() 来创建,不过与直接构造不同,即使不提供初始化参数,它也必定会用“零值”创建出一个有效值的 optional 对象,这一点我们在用的时候要特别注意。

#include <iostream>
#include <vector>
#include <optional>
using namespace std;
int main()
{auto op1 = make_optional<int>();    // 使用默认值构造有效值if (op1.has_value())                                 {          cout << "op1 value = " << op1.value() << endl; }  auto op2 = make_optional<std::vector<double>>();    // 使用默认值构造有效值if (op2.has_value())                              {          cout << "op2 size = " << op2->size() << endl; } }

   运行结果:

op1 value = 0
op2 size = 0

4.应用示例

        实现一个求平方根的函数。

#include <iostream>
#include <optional>
using namespace std;optional<double> safesqrt(double x)
{optional<double> v;        if (x < 0) {            return v;           }v  = ::sqrt(x);         return v;            
}int main()
{optional<double> v1 =  safesqrt(-1);if (v1.has_value())                                 {          cout << "v1 value = " << v1.value() << endl; }  optional<double> v2 =  safesqrt(3);if (v2.has_value())                              {          cout << "v2 size = " << v2.value() << endl; } 
};

运行结果

v2 size = 1.73205

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/61131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域&#xff0c;有时我们需要深入到视频文件的底层结构中去。UltraEdit&#xff08;UE&#xff09;和UEStudio作为强大的文本编辑器&#xff0c;允许我们以十六进制模式打开和搜索MP4文件。本文将指导…

Docker占用空间太大磁盘空间不足清理妙招

docker占用空间太大了&#xff0c;磁盘空间不足&#xff0c;清理3妙招 清除所有已停止的容器&#xff08;container&#xff09;、未被任何容器所使用的卷&#xff08;volume&#xff09;、未被任何容器所关联的网络&#xff08;network&#xff09;、所有悬空镜像&#xff08…

Spring Boot 接口防重复提交解决方案

文章目录 前言使用Token机制实现步骤1.生成Token2.传递Token3.验证Token 使用Redis实现步骤1.引入Redis依赖2.生成Token3.传递Token4.验证Token 使用Spring AOP实现步骤1.定义注解2.创建切面3.使用注解 总结 前言 在Web开发中&#xff0c;防止用户重复提交表单是一个常见的需求…

Linux性能优化之火焰图简介

Linux 火焰图&#xff08;Flame Graph&#xff09;是一种可视化工具&#xff0c;用于分析程序性能问题&#xff0c;尤其是 CPU 使用情况。它展示了程序中函数调用的层次结构和各个调用栈占用的时间比例。 以下是详细介绍&#xff0c;包括火焰图的工作原理、生成步骤和实际使用中…

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因&#xff0c;我的东西最终需要跑在amd64上&#xff0c;但是因为mac的架构师arm64&#xff0c;所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构&#xff1a; docker inspect 8135f475e221 | grep Arc…

【JavaWeb】JavaWeb入门之XML详解

目录 1.XML介绍 1.1.XML概述 1.1.1.什么是XML 1.1.2.XML的作用 1.1.3.XML与HTML的比较 1.1.4.XML和properties&#xff08;属性文件&#xff09;比较 1.1.5.W3C组织 1.2.XML语法概述 1.2.1.XML文档展示 1.2.2.XML文档的组成部分 1.3.XML文档声明 1.3.1.什么是XML文…

spring源码02-spring容器启动(容器初始化+bean实例化)源码解读【常见面试题】

文章目录 【README】【1】spring容器初始化及bean实例化步骤列表【2】spring容器初始化源码【2.1】容器初始化主要步骤总结&#xff1a;【2.2】容器初始化详细步骤源码分析 【3】bean实例化源码【3.1】bean实例化主要步骤总结&#xff08;非常重要&#xff09;【3.1.1】 bean生…

Python中的正则表达式教程

一、 正则表达式基础 1。1。概念介绍 正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。 其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。 它拥有自己独特的语法以及一个独立的处理引擎&#xff0c;在提供了正则表达式…

【Python库安装】Python环境安装景观模式分析常用库PyLandStats

【Python库安装】Python环境安装景观模式分析常用库PyLandStats PyLandStats 简介景观分割景观指标 PyLandStats 安装参考 PyLandStats 简介 PyLandStats 是一个用于景观模式分析的 Python 库。它允许用户计算景观格局的各种统计量和指标&#xff0c;广泛应用于生态学、地理信…

Visual Studio 2022 安装

下载链接 https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?skuCommunity&channelRelease&versionVS2022&sourceVSLandingPage&cid2030&passivefalse 安装 以c为例&#xff0c;列出需要勾选的项目&#xff0c;有3个&a…

HTML(超文本标记语言)

HTML&#xff08;超文本标记语言 - HyperText Markup Language&#xff09;是一种用于创建网页的标准标记语言。 HTML 最初是由蒂姆・伯纳斯 - 李&#xff08;Tim Berners - Lee&#xff09;在 1990 年左右开发的。当时的目的是为了让世界各地的科学家能够方便地共享和交流信息…

Spark 共享变量:广播变量与累加器解析

Spark 的介绍与搭建&#xff1a;从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交&#xff1a;本地与集群模式全解析-CSDN博客 Spark on YARN&#xff1a;Spark集群模式…

《C++设计模式:重塑游戏角色系统类结构的秘籍》

在游戏开发领域&#xff0c;游戏角色系统的类结构设计至关重要。一个良好的类结构可以使游戏更易于扩展、维护和优化&#xff0c;而 C中的设计模式为我们提供了强大的工具来实现这一目标。 一、理解游戏角色系统的复杂性 游戏角色系统通常具有高度的复杂性。每个角色都有自己…

python程序对服务器cpu和内存资源占用的管理。

背景 在服务器上部署了一套目标检测的程序&#xff0c;做成while true 的轮询检测数据更新的定时任务。 结果没想到那台服务器还有一套可视化程序要给领导演示看&#xff0c;结果演示的时候平台各种报错。 然后通过top查看了一下资源利用率发现python的程序cpu 130。&#xf…

Golang | Leetcode Golang题解之第565题数组嵌套

题目&#xff1a; 题解&#xff1a; func arrayNesting(nums []int) (ans int) {n : len(nums)for i : range nums {cnt : 0for nums[i] < n {i, nums[i] nums[i], ncnt}if cnt > ans {ans cnt}}return }

网络技术-定义配置ACL规则的语法和命令

定义ACL&#xff08;访问控制列表&#xff09;规则时&#xff0c;具体命令会根据所使用的设备和操作系统而有所不同。以下是一些常见的设备和操作系统中定义ACL规则的命令示例&#xff1a; 一&#xff1a;思科&#xff08;Cisco&#xff09;路由器/交换机 在思科设备中&#…

Git 搭建远程仓库、在 IDEA 工具中的配置和使用

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit&#xff08;小乌龟 &#xff09;的安装与使用-CSDN博客 目录 一、远程仓库 1&#xff09;在github上创建仓库 2&#xff09;在gitee上创建项目 3&#xff09;如何将远程的项目clone 到本地 4&#xff09;公司自己…

2024山西省网络建设运维第十八届职业院校技能大赛解析答案(4. Openssl证书服务)

\4. Openssl证书服务 任务描述:创建证书服务器,实现安全通讯访问。 (1)配置linux1为CA服务器,为linux主机颁发证书。证书颁发机构有效 期10年,公用名为linux1.skills.cn。申请并颁发一张供linux服务器使 用的证书,证书信息:有效期=5年,公用名=skills.cn,国家=CN,…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

Java | Leetcode Java题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; class Solution {public String nearestPalindromic(String n) {long selfNumber Long.parseLong(n), ans -1;List<Long> candidates getCandidates(n);for (long candidate : candidates) {if (candidate ! selfNumber) {if (ans…