std::optional — C++17

发布于 2024-08-14  34 次阅读


std::optional --- C++17

用来表示某个值是可选的,也就是说,这个值可能存在,也可能不存在。

std::optional 提供了一种类型安全的方式来避免使用像 nullptr 或特殊值这样的传统方法。

#include <iostream>
#include <optional>

std::optional<int> divide(int numerator, int denominator) {
    if (denominator == 0) {
        // 返回一个空的 std::optional 对象
        return std::nullopt;
    }
    // 返回一个含有实际结果的 optional
    return numerator / denominator;
}

int main() {
    auto result = divide(10, 2);
    if (result) { // 检查 result 是否有值
        std::cout << "Result: " << *result << std::endl; // 使用 * 操作符访问值
    } else {
        std::cout << "Division by zero." << std::endl;
    }

    auto no_result = divide(10, 0);
    std::cout << "Result available? " << no_result.has_value() << std::endl; // 使用 has_value() 检查是否有值

    return 0;
}

使用 value_or 方法

std::optional 对象没有值时提供一个默认值,可以使用 value_or 方法。

#include <iostream>
#include <optional>

int main() {
    std::optional<int> opt = std::nullopt;

    // 如果 opt 没有值,返回默认值 100
    std::cout << "Value or 100: " << opt.value_or(100) << std::endl;

    opt = 200;
    // 如果 opt 有值,返回 opt 的值
    std::cout << "Value or 100: " << opt.value_or(100) << std::endl;

    return 0;
}

错误处理

std::optional 可以用来优雅地处理错误情况,特别是在函数可能返回无效结果的情况下。

#include <iostream>
#include <optional>
#include <string>

std::optional<std::string> find_username(int user_id) {
    if (user_id == 1) {
        return "JohnDoe";
    }
    return std::nullopt;
}

int main() {
    auto username = find_username(1);
    if (username) {
        std::cout << "Found username: " << *username << std::endl;
    } else {
        std::cout << "Username not found." << std::endl;
    }

    return 0;
}
QQ:2219349024
最后更新于 2024-08-14