Spec-Zone.ru › C++

std::optional<T>::or_else

template< class F >
constexpr optional or_else( F&& f ) const&;
(1) (с C++23)
template< class F >
constexpr optional or_else( F&& f ) &&;
(2) (с C++23)

Возвращает *this, если содержит значение. В противном случае возвращает результат f.

Программа некорректна, если std::remove_cvref_t<std::invoke_result_t<F>> не совпадает с std::optional<T>.

1) Эквивалентно return *this ? *this : std::forward<F>(f)();. Эта перегрузка участвует в разрешении перегрузки, только если выполняются оба условия: std::copy_constructible<T> и std::invocable<F>.
2) Эквивалентно return *this ? std::move(*this) : std::forward<F>(f)();. Эта перегрузка участвует в разрешении перегрузки, только если выполняются оба условия: std::move_constructible<T> и std::invocable<F>.

Параметры

f - функция или объект Callable, возвращающий std::optional<T>

Возвращаемое значение

*this или результат f, как описано выше.

Примечания

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_optional 202110L (C++23) Монадические операции в std::optional

Пример

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

int main()
{
    using maybe_int = std::optional<int>;

    auto valueless = []
    {
        std::cout << "Valueless: ";
        return maybe_int{0};
    };

    maybe_int x;
    std::cout << x.or_else(valueless).value() << '\n';

    x = 42;
    std::cout << "Has value: ";
    std::cout << x.or_else(valueless).value() << '\n';

    x.reset();
    std::cout << x.or_else(valueless).value() << '\n';
}

Вывод:

Valueless: 0
Has value: 42
Valueless: 0

См. также

value_or
возвращает хранящееся значение, если оно доступно, иное значение в противном случае
(открытая функция-член)
and_then
(C++23)
возвращает результат применения указанной функции к хранящемуся значению, если оно существует, или пустой optional в противном случае
(открытая функция-член)
transform
(C++23)
возвращает optional, содержащее преобразованное хранящееся значение, если оно существует, или пустой optional в противном случае
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/optional/or_else

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API