C++ 库 - <expected>



C++ 中的<expected> 头文件提供了各种函数和操作,用于以能够表达预期值的存在或意外错误的方式处理值或错误。

它类似于 std::optional,但此外,还能够存储在预期值不存在时信息。此 <expected> 头文件是通用实用程序库的一部分。

包含 <expected> 头文件

要在您的 C++ 程序中包含 <expected> 头文件,可以使用以下语法。

#include <expected>

<expected> 头文件的函数

以下是 <expected> 头文件中所有函数的列表。

序号 函数及描述
1 operator->, operator*

这些函数提供对预期值的访问。

2 operator bool, has_value

这些函数检查对象是否包含预期值。

3 value

此函数返回预期值。

4 error

此函数返回意外值。

5 value_or

如果存在,此函数返回预期值;否则,返回另一个值。

6 error_or

如果存在,此函数返回意外值;否则,返回另一个值。

检索值

在以下示例中,我们将使用 value() 在存在的情况下检索预期值。

#include <iostream>
#include <expected>
int main() {
    std::expected<int, std::string> result = 42;  
    if (result.has_value()) {
        std::cout << "Expected value: " << result.value() << std::endl;  
    } else {
        std::cout << "Unexpected error: " << result.error() << std::endl;
    }
    return 0;
}

输出

如果我们运行上述代码,它将生成以下输出:

Expected value: 42

单子操作

单子操作提供了一种操作和转换预期对象中值或错误的方法。

序号 函数及描述
1 and_then

如果存在,此函数返回给定函数对预期值的返回值;否则,返回预期本身。

2 transform

如果存在,此函数返回包含已转换预期值的预期;否则,返回预期本身。

3 or_else

如果预期对象包含预期值,此函数返回预期本身;否则,返回给定函数对意外值的返回值。

4 transform_error

如果预期对象包含预期值,此函数返回预期本身;否则,返回包含已转换意外值的预期。

单子操作示例

在以下示例中,我们将使用 and_then() 函数将 multiply_by_two 应用于预期值 (21),返回一个包含结果 (42) 的新 std::expected 对象。

#include <iostream>
#include <expected>
std::expected<int, std::string multiply_by_two(int x) {
    return x * 2;
}
int main() {
    std::expected<int, std::string> result = 21;
    auto new_result = result.and_then(multiply_by_two);  

    if (new_result.has_value()) {
        std::cout << "New expected value: " << new_result.value() << std::endl;
    } else {
        std::cout << "Unexpected error: " << new_result.error() << std::endl;
    }
    return 0;
}

输出

如果我们运行上述代码,它将生成以下输出:

New expected value: 42

修饰符

std::expected 中的修饰符是允许我们修改预期对象的状态或内容的函数。

序号 函数及描述
1 emplace

此函数就地构造预期值,替换任何现有的值或错误。

2 operator bool, has_value

此函数交换两个对象的内容。

修改值

在以下示例中,我们将使用 emplace(),它将任何当前状态(无论它包含值还是错误)替换为新的预期值 (10)。

#include <iostream>
#include <expected>
int main() {
    std::expected<int, std::string> result = std::unexpected("Initial error");
    result.emplace(10);

    if (result.has_value()) {
        std::cout << "Replaced with new expected value: " << result.value() << std::endl;
    } else {
        std::cout << "Unexpected error: " << result.error() << std::endl;
    }
    return 0;
}

输出

如果我们运行上述代码,它将生成以下输出:

Replaced with new expected value: 10
广告