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 中的一个标准库组件,optional <T>对象默认是空的,也就是处于无效状态,给它赋值后因为里面有了元素,就变成了有效状态。 1.引入背景 c函数常用返回值表示函数是否执行成功。如返回nullptr表示…...
猫狗识别之BUG汇总
一、github登不上去问题 下载watt toolkit 下载地址:https://steampp.net/ 可以下载后加速,访问github 二、猫狗总体参考核心 B哥的博客 https://github.com/bubbliiiing/classification-keras?tabreadme-ov-file 三、CSDN很多会员才能阅读问题 根据…...
【论文复现】自动化细胞核分割与特征分析
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀自动化细胞核分割与特征分析 引言1. 效果展示2. HoverNet概述3. HoverNet原理分析整体网络框架实例分割原理 4. HoverNet评估结果5. 复现过程…...
排序算法 -快速排序
文章目录 1. 快速排序(Quick Sort)1.1、 简介1.2、 快速排序的步骤 2. Hoare 版本2.1、 基本思路1. 分区(Partition)2. 基准选择(Pivot Selection)3. 递归排序(Recursive Sorting) 2…...
K8S 查看pod节点的磁盘和内存使用情况
查看某个节点的磁盘使用率: kubectl exec -it pod名称 -n 命名空间 – df -h 查询所有节点的已使用内存: kubectl top pods --all-namespaces | grep itsm 查询某个节点的总内存, kubectl describe pod itsr-domain-59f4ff5854-hzb68 --nam…...
华为HCIP——MSTP/RSTP与STP的兼容性
一、MSTP/RSTP与STP的兼容性的原理: 1.BPDU版本号识别:运行MSTP/RSTP协议的交换机会根据收到的BPDU(Bridge Protocol Data Unit,桥协议数据单元)版本号信息自动判断与之相连的交换机的运行模式。如果收到的是STP BPDU…...
AI 大模型如何重塑软件开发流程:现状与未来展望
随着人工智能技术的飞速发展,AI 大模型的出现正在深刻改变软件开发行业的传统模式。从代码生成到智能测试,AI 已渗透到软件开发的各个环节,为开发者提供了前所未有的效率提升,同时也带来了全新的挑战与思考。在本文中,…...
3步实现贪吃蛇
方法很简单,打开页面,复制,粘贴 一.整体思维架构 我们根据游戏的开始,运行,结束,将整个游戏划分成三个部分。在每个部分下面又划分出多个功能,接下来我们就根据模块一一实现功能。 二.Gamesta…...
华东师范大学数学分析第五版PDF习题答案上册及下册
“数学分析”是数学专业最重要的一门基础课程,也是报考数学类专业硕士研究生的专业考试科目。为了帮助、指导广大读者学好这门课程,编者编写了与华东师范大学数学科学学院主编的《数学分析》(第五版)配套的辅导用书,以帮助读者加深对基本概念…...
MySQL之联合查询
前文我们了解到了数据库设计的范式要求,故生活中很多相互关联的数据被拆分开来,但彼此之间通过某种条件链接,此文联合查询就是通过多表之间的连接关系,来查询我们想要的数据,即 《联合查询》 1. 联合查询简介 1.1 为什…...
[C/C++] 定位新表达式 placement new
在C中,表达式 new (ptr) T(); 展示了一种特殊的内存分配和对象构造方式,这被称为定位新表达式(placement new)。 通常,当我们使用 new 关键字时,它会在堆上动态分配内存,并调用相应的构造函数来…...
【MySQL】MySQL的笛卡尔积现象是什么?简单说说
笛卡尔积好像是个科学家,也是个学术概念,在MySQL中表示交叉连接,即:匹配一切所有的可能 举例如下: 准备两张表 【employee表】 emp_idlast_namedept_id1Smith12Johnson2 【department表】 dept_iddepartment_nam…...
《InsCode AI IDE:编程新时代的引领者》
《InsCode AI IDE:编程新时代的引领者》 一、InsCode AI IDE 的诞生与亮相二、独特功能与优势(一)智能编程体验(二)多语言支持与功能迭代 三、实际应用与案例(一)游戏开发案例(二&am…...
微搭低代码私有化部署搭建教程
目录 1 下载远程工具2 查看服务器配置3 下载部署包4 安装部署包5 系统登录总结 最近微搭推出了私有化部署版本,正好官方赠送了我一台云服务器,练习一下部署的过程,本篇作为一个实践的记录 1 下载远程工具 一般我们使用的是云服务器ÿ…...
【在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快很多,不仅如此,代码往往精简得多。 So, 这篇来讲讲进阶的广播和花哨索引操作,少写几个for循环()。 目录 一个二维的例题 一个三维的例题 解法一 解法二 更难的三维例题…...
【Nginx】反向代理Https时相关参数:
在Nginx代理后台HTTPS服务时,有几个关键的参数需要配置,以确保代理服务器能够正确地与后端服务器进行通信。一些重要参数的介绍: proxy_ssl_server_name:这个参数用于指定是否在TLS握手时通过SNI(Server Name Indicati…...
第 17 章 - Go语言 上下文( Context )
在Go语言中,context包为跨API和进程边界传播截止时间、取消信号和其他请求范围值提供了一种方式。它主要应用于网络服务器和长时间运行的后台任务中,用于控制一组goroutine的生命周期。下面我们将详细介绍context的定义、使用场景、取消和超时机制&#…...
Android Framework AMS(16)进程管理
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读AMS 进程方面的知识。关注思维导图中左上侧部分即可。 我们本章节主要是对Android进程管理相关知识有一个基本的了解。先来了解下L…...
STM32设计防丢防摔智能行李箱
目录 目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 随着科技的不断发展,嵌入式系统、物联网技术、智能设备…...
5步掌握LinkSwift网盘直链下载助手:告别限速困扰的完整技术方案
5步掌握LinkSwift网盘直链下载助手:告别限速困扰的完整技术方案 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云…...
Adobe-GenP终极指南:如何免费激活Adobe全家桶的完整教程
Adobe-GenP终极指南:如何免费激活Adobe全家桶的完整教程 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP Adobe-GenP是一款专门针对Adobe Creative Cloud…...
WeChatExporter终极指南:三步轻松备份微信聊天记录完整解决方案
WeChatExporter终极指南:三步轻松备份微信聊天记录完整解决方案 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因更换手机而丢失重要的微信聊天记录…...
嵌入式开发者如何利用Taotoken管理多个大模型API密钥
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 嵌入式开发者如何利用Taotoken管理多个大模型API密钥 对于嵌入式开发者而言,项目往往涉及多种智能应用场景,…...
Vivado携手Modelsim:跨越版本鸿沟的仿真实战指南
1. 为什么需要Vivado与Modelsim联合仿真? 刚接触FPGA开发的朋友可能会疑惑:Vivado明明自带仿真工具,为什么还要折腾第三方工具?这个问题我十年前刚开始用ISE套件时就深有体会。Vivado Simulator虽然集成度高,但存在几…...
别再死记硬背公式了!手把手教你用AP法搞定LLC变压器磁芯选型(附Excel计算表)
告别公式恐惧!AP法实战指南:LLC变压器磁芯选型极简流程(附智能计算工具) 在电源设计领域,LLC谐振变换器因其高效率、软开关特性备受青睐,但变压器磁芯选型往往成为工程师的"拦路虎"。传统方法需要…...
macOS原生AI聚合客户端macai:SwiftUI构建,集成ChatGPT/Claude/Gemini与本地Ollama模型
1. 项目概述:macai,一个为macOS而生的全能AI聊天客户端如果你和我一样,是个重度依赖AI辅助工作的macOS用户,同时又对各种AI服务提供商(ChatGPT、Claude、Gemini、Grok……)感到眼花缭乱,那么你很…...
基于Redis向量数据库的arXiv论文语义搜索引擎实战
1. 项目概述:构建一个基于语义的学术论文搜索引擎如果你经常在arXiv上找论文,肯定有过这样的体验:面对海量的预印本,用关键词搜索出来的结果要么不相关,要么漏掉了真正重要的文献。传统的基于关键词匹配的搜索…...
AI Agent自动化求职实战:基于Python与LLM的智能简历投递系统
1. 项目概述与核心价值最近在技术社区里,关于AI Agent如何自动化处理重复性工作的讨论越来越热。作为一个在招聘和自动化领域摸爬滚打了十来年的老手,我亲眼见证了求职者从海投简历到使用各种工具辅助的演变。今天想和大家深入聊聊一个让我印象深刻的开源…...
掌握pip的基本命令和高级用法:轻松管理Python包
Ubuntu系统安装pip: 打开终端,输入以下命令以更新软件包列表: sudo apt-get update 安装pip包: sudo apt-get install python3-pip 安装完成后,可以通过以下命令来验证pip是否成功安装: pip3 --version …...
