- C 标准库
- C 标准库
- C++ 标准库
- C++ 库 - 首页
- C++ 库 - <fstream>
- C++ 库 - <iomanip>
- C++ 库 - <ios>
- C++ 库 - <iosfwd>
- C++ 库 - <iostream>
- C++ 库 - <istream>
- C++ 库 - <ostream>
- C++ 库 - <sstream>
- C++ 库 - <streambuf>
- C++ 库 - <atomic>
- C++ 库 - <complex>
- C++ 库 - <exception>
- C++ 库 - <functional>
- C++ 库 - <limits>
- C++ 库 - <locale>
- C++ 库 - <memory>
- C++ 库 - <new>
- C++ 库 - <numeric>
- C++ 库 - <regex>
- C++ 库 - <stdexcept>
- C++ 库 - <string>
- C++ 库 - <thread>
- C++ 库 - <tuple>
- C++ 库 - <typeinfo>
- C++ 库 - <utility>
- C++ 库 - <valarray>
- C++ STL 库
- C++ 库 - <array>
- C++ 库 - <bitset>
- C++ 库 - <deque>
- C++ 库 - <forward_list>
- C++ 库 - <list>
- C++ 库 - <map>
- C++ 库 - <multimap>
- C++ 库 - <queue>
- C++ 库 - <priority_queue>
- C++ 库 - <set>
- C++ 库 - <stack>
- C++ 库 - <unordered_map>
- C++ 库 - <unordered_set>
- C++ 库 - <vector>
- C++ 库 - <algorithm>
- C++ 库 - <iterator>
- C++ 高级库
- C++ 库 - <any>
- C++ 库 - <barrier>
- C++ 库 - <bit>
- C++ 库 - <chrono>
- C++ 库 - <cinttypes>
- C++ 库 - <clocale>
- C++ 库 - <condition_variable>
- C++ 库 - <coroutine>
- C++ 库 - <cstdlib>
- C++ 库 - <cstring>
- C++ 库 - <cuchar>
- C++ 库 - <charconv>
- C++ 库 - <cfenv>
- C++ 库 - <cmath>
- C++ 库 - <ccomplex>
- C++ 库 - <expected>
- C++ 库 - <format>
- C++ 库 - <future>
- C++ 库 - <flat_set>
- C++ 库 - <flat_map>
- C++ 库 - <filesystem>
- C++ 库 - <generator>
- C++ 库 - <initializer_list>
- C++ 库 - <latch>
- C++ 库 - <memory_resource>
- C++ 库 - <mutex>
- C++ 库 - <mdspan>
- C++ 库 - <optional>
- C++ 库 - <print>
- C++ 库 - <ratio>
- C++ 库 - <scoped_allocator>
- C++ 库 - <semaphore>
- C++ 库 - <source_location>
- C++ 库 - <span>
- C++ 库 - <spanstream>
- C++ 库 - <stacktrace>
- C++ 库 - <stop_token>
- C++ 库 - <syncstream>
- C++ 库 - <system_error>
- C++ 库 - <string_view>
- C++ 库 - <stdatomic>
- C++ 库 - <variant>
- C++ STL 库速查表
- C++ STL - 速查表
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