std::expected<T,E>::transform
template< class F > constexpr auto transform( F&& f ) &; | (1) | (с C++23) |
template< class F > constexpr auto transform( F&& f ) const&; | (2) | (с C++23) |
template< class F > constexpr auto transform( F&& f ) &&; | (3) | (с C++23) |
template< class F > constexpr auto transform( F&& f ) const&&; | (4) | (с C++23) |
Если *this содержит ожидаемое значение, вызывает f и возвращает объект std::expected, содержащий его результат; в противном случае возвращает объект std::expected, содержащий копию error().
Если T не является (возможно, cv-квалифицированным) void, содержащееся значение (operator*()) передаётся в качестве аргумента в f; в противном случае f не принимает аргументов.
Пусть U — это:
- если
Tне является (возможно, cv-квалифицированным) void:- для перегрузок (1-2) —
std::remove_cv_t<std::invoke_result_t<F, decltype(operator*())>>; - для перегрузок (3-4) —
std::remove_cv_t<std::invoke_result_t<F, decltype(std::move(operator*()))>>;
- для перегрузок (1-2) —
- в противном случае (
Tявляется, возможно, cv-квалифицированным void) —std::remove_cv_t<std::invoke_result_t<F>>.
U должен быть допустимым типом значения для std::expected. Объект типа U должен быть конструируем из результата вызова (но не обязательно перемещаемо конструируем). Тип возвращаемого значения — std::expected<U, E>.
std::is_constructible_v<E, decltype(error())> равно true.std::is_constructible_v<E, decltype(std::move(error()))> равно true.Формально эти функции выполняют следующие действия:
- Если
*thisсодержит ожидаемое значениеval:
- Вызвать
f, как если бы это было выполнено посредством-
std::invoke(std::forward<F>(f), val)для перегрузок (1,2), еслиstd::is_void_v<T>равно false; -
std::invoke(std::forward<F>(f), std::move(val))для перегрузок (3,4), еслиstd::is_void_v<T>равно false; -
std::invoke(std::forward<F>(f)), еслиstd::is_void_v<T>равно true.
-
- Затем:
- если
std::is_void_v<U>равно false, вернуть объектstd::expected, содержащий ожидаемое значение, непосредственно инициализированный результатом вызова; - в противном случае вернуть
std::expected<U, E>().
- если
- В противном случае (
*thisсодержит ошибочное значение) вернутьstd::expected<U, E>(std::unexpect, error()).
Параметры
| f | - | подходящая функция или объект Callable, сигнатура вызова которого возвращает тип, не являющийся ссылочным |
Возвращаемое значение
Объект std::expected, содержащий либо результат f, либо ошибочное значение, как описано выше.
Примечания
| Макрос проверки поддержки функции | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_expected | 202211L | (C++23) | Монадические функции для std::expected |
Пример
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применяется к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 3938 | C++23 | ожидаемое значение получалось с помощью value(), для чего требовалось, чтобы E был копируемо конструируемым | изменено на **this |
| LWG 3973 | C++23 | ожидаемое значение получалось с помощью **this, что может включать поиск, зависящий от аргументов | изменено на прямое указание имени члена |
См. также
возвращает сам expected, если он содержит ожидаемое значение; в противном случае возвращает expected, содержащее преобразованное неожиданное значение (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/expected/transform