当前位置: 首页 > news >正文

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

相关文章:

C++中的 std::optional

std::optional<T>是 C17 中的一个标准库组件&#xff0c;optional <T>对象默认是空的&#xff0c;也就是处于无效状态&#xff0c;给它赋值后因为里面有了元素&#xff0c;就变成了有效状态。 1.引入背景 c函数常用返回值表示函数是否执行成功。如返回nullptr表示…...

猫狗识别之BUG汇总

一、github登不上去问题 下载watt toolkit 下载地址&#xff1a;https://steampp.net/ 可以下载后加速&#xff0c;访问github 二、猫狗总体参考核心 B哥的博客 https://github.com/bubbliiiing/classification-keras?tabreadme-ov-file 三、CSDN很多会员才能阅读问题 根据…...

【论文复现】自动化细胞核分割与特征分析

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀自动化细胞核分割与特征分析 引言1. 效果展示2. HoverNet概述3. HoverNet原理分析整体网络框架实例分割原理 4. HoverNet评估结果5. 复现过程…...

排序算法 -快速排序

文章目录 1. 快速排序&#xff08;Quick Sort&#xff09;1.1、 简介1.2、 快速排序的步骤 2. Hoare 版本2.1、 基本思路1. 分区&#xff08;Partition&#xff09;2. 基准选择&#xff08;Pivot Selection&#xff09;3. 递归排序&#xff08;Recursive Sorting&#xff09; 2…...

K8S 查看pod节点的磁盘和内存使用情况

查看某个节点的磁盘使用率&#xff1a; kubectl exec -it pod名称 -n 命名空间 – df -h 查询所有节点的已使用内存&#xff1a; kubectl top pods --all-namespaces | grep itsm 查询某个节点的总内存&#xff0c; kubectl describe pod itsr-domain-59f4ff5854-hzb68 --nam…...

华为HCIP——MSTP/RSTP与STP的兼容性

一、MSTP/RSTP与STP的兼容性的原理&#xff1a; 1.BPDU版本号识别&#xff1a;运行MSTP/RSTP协议的交换机会根据收到的BPDU&#xff08;Bridge Protocol Data Unit&#xff0c;桥协议数据单元&#xff09;版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…...

AI 大模型如何重塑软件开发流程:现状与未来展望

随着人工智能技术的飞速发展&#xff0c;AI 大模型的出现正在深刻改变软件开发行业的传统模式。从代码生成到智能测试&#xff0c;AI 已渗透到软件开发的各个环节&#xff0c;为开发者提供了前所未有的效率提升&#xff0c;同时也带来了全新的挑战与思考。在本文中&#xff0c;…...

3步实现贪吃蛇

方法很简单&#xff0c;打开页面&#xff0c;复制&#xff0c;粘贴 一.整体思维架构 我们根据游戏的开始&#xff0c;运行&#xff0c;结束&#xff0c;将整个游戏划分成三个部分。在每个部分下面又划分出多个功能&#xff0c;接下来我们就根据模块一一实现功能。 二.Gamesta…...

华东师范大学数学分析第五版PDF习题答案上册及下册

“数学分析”是数学专业最重要的一门基础课程&#xff0c;也是报考数学类专业硕士研究生的专业考试科目。为了帮助、指导广大读者学好这门课程&#xff0c;编者编写了与华东师范大学数学科学学院主编的《数学分析》(第五版)配套的辅导用书&#xff0c;以帮助读者加深对基本概念…...

MySQL之联合查询

前文我们了解到了数据库设计的范式要求&#xff0c;故生活中很多相互关联的数据被拆分开来&#xff0c;但彼此之间通过某种条件链接&#xff0c;此文联合查询就是通过多表之间的连接关系&#xff0c;来查询我们想要的数据&#xff0c;即 《联合查询》 1. 联合查询简介 1.1 为什…...

[C/C++] 定位新表达式 placement new

在C中&#xff0c;表达式 new (ptr) T(); 展示了一种特殊的内存分配和对象构造方式&#xff0c;这被称为定位新表达式&#xff08;placement new&#xff09;。 通常&#xff0c;当我们使用 new 关键字时&#xff0c;它会在堆上动态分配内存&#xff0c;并调用相应的构造函数来…...

【MySQL】MySQL的笛卡尔积现象是什么?简单说说

笛卡尔积好像是个科学家&#xff0c;也是个学术概念&#xff0c;在MySQL中表示交叉连接&#xff0c;即&#xff1a;匹配一切所有的可能 举例如下&#xff1a; 准备两张表 【employee表】 emp_idlast_namedept_id1Smith12Johnson2 【department表】 dept_iddepartment_nam…...

《InsCode AI IDE:编程新时代的引领者》

《InsCode AI IDE&#xff1a;编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势&#xff08;一&#xff09;智能编程体验&#xff08;二&#xff09;多语言支持与功能迭代 三、实际应用与案例&#xff08;一&#xff09;游戏开发案例&#xff08;二&am…...

微搭低代码私有化部署搭建教程

目录 1 下载远程工具2 查看服务器配置3 下载部署包4 安装部署包5 系统登录总结 最近微搭推出了私有化部署版本&#xff0c;正好官方赠送了我一台云服务器&#xff0c;练习一下部署的过程&#xff0c;本篇作为一个实践的记录 1 下载远程工具 一般我们使用的是云服务器&#xff…...

【在Linux世界中追寻伟大的One Piece】多路转接epoll(续)

目录 1 -> epoll的工作方式 1.1 -> 水平触发(Level Triggered)工作模式 1.2 -> 边缘触发(Edge Triggered)工作模式 2 -> 对比LT与ET 3 -> 理解ET模式和非阻塞文件描述符 4 -> epoll的使用场景 5 -> epoll示例 5.1 -> epoll服务器(LT模式) 5.2…...

【不写for循环】玩玩行列

利用numpy的并行操作可以比纯用Python的list快很多&#xff0c;不仅如此&#xff0c;代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作&#xff0c;少写几个for循环&#xff08;&#xff09;。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...

【Nginx】反向代理Https时相关参数:

在Nginx代理后台HTTPS服务时&#xff0c;有几个关键的参数需要配置&#xff0c;以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍&#xff1a; proxy_ssl_server_name&#xff1a;这个参数用于指定是否在TLS握手时通过SNI&#xff08;Server Name Indicati…...

第 17 章 - Go语言 上下文( Context )

在Go语言中&#xff0c;context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中&#xff0c;用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...

Android Framework AMS(16)进程管理

该系列文章总纲链接&#xff1a;专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明&#xff1a; 说明&#xff1a;本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…...

STM32设计防丢防摔智能行李箱

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展&#xff0c;嵌入式系统、物联网技术、智能设备…...

基于大模型的 UI 自动化系统

基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

初学 pytest 记录

安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

MinIO Docker 部署:仅开放一个端口

MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...