Bootstrap

std::optional

在 C++17 中,std::optional 是一个非常有用的类型,它用于封装一个可能不存在的值。它提供了一种安全的方式来处理可能为空的值,避免了使用 NULLnullptr 带来的问题。

以下是 std::optional 的一些基本用法:

  1. 创建 std::optional 对象

    • 使用 std::nulloptstd::make_optional 创建一个空的 std::optional
    • 使用值初始化创建一个非空的 std::optional
    std::optional<int> opt1 = std::nullopt; // 创建一个空的optional
    std::optional<int> opt2 = std::make_optional(10); // 创建一个包含10的optional
    std::optional<int> opt3(20); // 创建一个包含20的optional
    
  2. 访问 std::optional 的值

    • 使用 * 运算符或 -> 运算符访问值。
    • 使用 value() 方法访问值,如果 optional 是空的,则抛出 std::bad_optional_access 异常。
    if (opt3.has_value()) {
        std::cout << *opt3 << std::endl; // 输出20
        int value = opt3.value(); // 获取值
    } else {
        std::cout << "opt3 is empty" << std::endl;
    }
    
  3. 检查 std::optional 是否有值

    • 使用 has_value() 方法检查 optional 是否包含值。
    if (opt3.has_value()) {
        std::cout << "opt3 has a value" << std::endl;
    } else {
        std::cout << "opt3 is empty" << std::endl;
    }
    
  4. 赋值和重置

    • 可以给 optional 赋值,也可以使用 reset() 方法将其重置为无值状态。
    opt3 = 30; // 赋值
    opt3.reset(); // 重置为无值
    
  5. 使用 std::optional 作为函数参数和返回类型

    • 可以将 optional 用作函数参数,表示函数可以返回一个可选的值。
    • 可以将 optional 用作函数的返回类型,表示函数可以返回一个可选的结果。
    std::optional<int> find_value(const std::vector<int>& vec, int value) {
        for (int v : vec) {
            if (v == value) {
                return v;
            }
        }
        return std::nullopt;
    }
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        auto result = find_value(vec, 3);
        if (result.has_value()) {
            std::cout << "Found value: " << *result << std::endl;
        } else {
            std::cout << "Value not found" << std::endl;
        }
        return 0;
    }
    
  6. 比较 std::optional 对象

    • 可以比较两个 optional 对象,如果它们都包含值,则比较这些值;如果其中一个为空,则比较结果取决于另一个 optional 是否为空。
    std::optional<int> opt4(10);
    std::optional<int> opt5(20);
    std::optional<int> opt6 = std::nullopt;
    
    if (opt4 == opt5) {
        std::cout << "opt4 and opt5 have the same value" << std::endl;
    } else if (opt4 == opt6) {
        std::cout << "opt4 is empty or has the same value as opt6" << std::endl;
    } else {
        std::cout << "opt4 and opt5 have different values" << std::endl;
    }
    

通过这些基本用法,你可以在 C++ 中更安全、更灵活地处理可能为空的值。

;