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

Android常用C++特性之std::optional

声明:本文内容生成自ChatGPT,目的是为方便大家了解学习作为引用到作者的其他文章中。

std::optional 是 C++17 引入的一个模板类,用于表示可能缺失的值。它提供了一种安全的方法来处理可选值,允许变量在某些情况下没有值(即“无效”或“空”状态)。std::optional 是一种轻量级的替代方案,常用于替代指针或特殊值(如 nullptr 或负数)来表示缺失的值。

主要特点

  1. 表示可选性std::optional 可以包含一个值,或为空(不包含值)。
  2. 类型安全:与使用指针不同,std::optional 提供了更安全的类型检查。
  3. 简洁性:使代码更清晰,表示一个值的存在与否。

语法

#include <optional>std::optional<T> opt; // 默认构造,opt 没有值
std::optional<T> optWithValue = T(value); // 创建时有值

常用方法

  • has_value():检查 optional 是否包含一个值。
  • value():获取 optional 中的值,如果没有值则抛出 std::bad_optional_access 异常。
  • operator*()operator->():可以像使用指针一样访问值。
  • reset():清除 optional 中的值,使其为空。
  • emplace(args...):在 optional 内部构造一个值。

示例

1. 基本使用
#include <iostream>
#include <optional>std::optional<int> getOptionalValue(bool provideValue) {if (provideValue) {return 42; // 返回一个值} else {return std::nullopt; // 返回空值}
}int main() {auto value1 = getOptionalValue(true);if (value1.has_value()) {std::cout << "Value: " << value1.value() << std::endl;} else {std::cout << "No value provided." << std::endl;}auto value2 = getOptionalValue(false);if (value2.has_value()) {std::cout << "Value: " << value2.value() << std::endl;} else {std::cout << "No value provided." << std::endl;}return 0;
}

输出:

Value: 42
No value provided.
2. 使用 std::optional 存储自定义类型
#include <iostream>
#include <optional>
#include <string>struct Person {std::string name;int age;
};std::optional<Person> findPersonByName(const std::string& name) {if (name == "Alice") {return Person{"Alice", 30};} else {return std::nullopt; // 找不到人}
}int main() {auto person = findPersonByName("Alice");if (person.has_value()) {std::cout << "Found: " << person->name << ", Age: " << person->age << std::endl;} else {std::cout << "Person not found." << std::endl;}return 0;
}

输出:

Found: Alice, Age: 30

3. 默认值和异常处理

可以使用 value_or 方法来提供一个默认值:

#include <iostream>
#include <optional>int main() {std::optional<int> opt;// 如果没有值,返回默认值 10int value = opt.value_or(10);std::cout << "Value: " << value << std::endl; // 输出: Value: 10return 0;
}

注意事项

  • 使用 std::optional 时,必须确保在访问值之前检查其是否存在,以避免异常。
  • std::optional 适合用于表示可能缺失的单个值,但不适用于表示多个可选值的场景。

总结

  • std::optional 是 C++17 中引入的,用于表示可选值。
  • 它提供了一种类型安全的方式来处理缺失值,避免了使用指针或特殊值的复杂性。
  • 适用于函数返回值、配置选项等场景,可以提高代码的可读性和安全性。

相关文章:

  • 镜像电流源与其应用(防倒灌电路)
  • 双指针——数组元素目标和
  • 跑lvs出现soft connect怎么处理?
  • [Doc][ROS2]订阅发布、服务客户端区别
  • 单细胞Seruat和h5ad数据格式互换(R与python)方法学习和整理
  • UNI-SOP应用场景(1)- 纯前端预开发
  • Meta震撼发布Llama3.2大规模模型
  • Python使用最广泛的数据验证库Pydantic
  • 序列化与反序列化的原理及实践
  • js逆向——webpack扣取代码
  • 第J2周:ResNet50V2算法实战与解析
  • 微服务的优点及在云原生时代的合理落地方式
  • 设计模式之门面(Facade)模式
  • 【Java异常】(简简单单拿捏)
  • 剑指 offer 刷题集
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • egg(89)--egg之redis的发布和订阅
  • laravel5.5 视图共享数据
  • Map集合、散列表、红黑树介绍
  • PAT A1050
  • PAT A1092
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 聊聊redis的数据结构的应用
  • 免费小说阅读小程序
  • 前端技术周刊 2019-01-14:客户端存储
  • 前端面试总结(at, md)
  • 06-01 点餐小程序前台界面搭建
  • # Redis 入门到精通(七)-- redis 删除策略
  • #define用法
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Linux(帮助手册)
  • #微信小程序(布局、渲染层基础知识)
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot教学评价 毕业设计 641310
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)详解PHP处理密码的几种方式
  • (自用)交互协议设计——protobuf序列化
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .net core 外观者设计模式 实现,多种支付选择
  • .Net Remoting(分离服务程序实现) - Part.3
  • .net 获取某一天 在当月是 第几周 函数
  • .NET编程——利用C#调用海康机器人工业相机SDK实现回调取图与软触发取图【含免费源码】
  • .NET基础篇——反射的奥妙
  • .net开发时的诡异问题,button的onclick事件无效
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • /etc/fstab和/etc/mtab的区别
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [000-01-022].第03节:RabbitMQ环境搭建