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

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;

    // 如果没有值,返回默认值 10
    int value = opt.value_or(10);
    std::cout << "Value: " << value << std::endl; // 输出: Value: 10

    return 0;
}

注意事项

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

总结

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

http://www.kler.cn/a/326711.html

相关文章:

  • 简单讲解关于微信小程序调整 miniprogram 后, tabbar 找不到图片的原因之一
  • wordpress调用指定ID分类下浏览最多的内容
  • JVM的详细介绍
  • 【漫话机器学习系列】022.微积分中的链式求导法则(chain rule of Calculus)
  • K8s证书过期
  • 重温设计模式--迭代器模式
  • 7. 无线网络安全
  • Docker全家桶:Docker Compose项目部署
  • CICD Jenkins实现Pipline
  • sqli-labs时间盲注、布尔盲注脚本
  • 数据结构之链表(2),双向链表
  • 面试系列-携程暑期实习一面
  • C++ | Leetcode C++题解之第438题找到字符串中所有字母异位词
  • Python Web 应用中的 API 网关集成与优化
  • IText导出pdf不显示泰文
  • 438. 找到字符串中所有字母异位词
  • uniapp 知识点
  • 【前端样式】Sweetalert2简单用法
  • 如何使用ssm实现个人日常事务管理系统+vue
  • 金融教育宣传月 | 平安养老险百色中心支公司开展金融知识“消保县域行”宣传活动
  • 心理咨询预约管理系统(含源码+sql+视频导入教程)
  • web前端与koa框架node后端实现分片断点上传
  • xtu oj 六边形
  • 制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统
  • Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!
  • 【BurpSuite】访问控制漏洞和权限提升 | Access control vulnerabilities (3-6)