std::optional<T>:: and_then
|
template
<
class
F
>
constexpr auto and_then ( F && f ) & ; |
(1) | (depuis C++23) |
|
template
<
class
F
>
constexpr auto and_then ( F && f ) const & ; |
(2) | (depuis C++23) |
|
template
<
class
F
>
constexpr auto and_then ( F && f ) && ; |
(3) | (depuis C++23) |
|
template
<
class
F
>
constexpr auto and_then ( F && f ) const && ; |
(4) | (depuis C++23) |
Si
*
this
contient une valeur, invoque
f
avec la valeur contenue comme argument, et retourne le résultat de cette invocation ; sinon, retourne un
std::optional
vide.
Le type de retour (voir ci-dessous) doit être une spécialisation de
std::optional
(contrairement à
transform()
). Sinon, le programme est mal formé.
if (*this) return std::invoke(std::forward<F>(f), value()); else return std::remove_cvref_t<std::invoke_result_t<F, T&>>{};
if (*this) return std::invoke(std::forward<F>(f), value()); else return std::remove_cvref_t<std::invoke_result_t<F, const T&>>{};
if (*this) return std::invoke(std::forward<F>(f), std::move(value())); else return std::remove_cvref_t<std::invoke_result_t<F, T>>{};
if (*this) return std::invoke(std::forward<F>(f), std::move(value()); else return std::remove_cvref_t<std::invoke_result_t<F, const T>>{};
Table des matières |
Paramètres
| f | - | une fonction appropriée ou Callable qui retourne un std::optional |
Valeur de retour
Le résultat de f ou un std::optional vide, comme décrit ci-dessus.
Notes
Certains langages appellent cette opération flatmap .
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_optional
|
202110L
|
(C++23) | Opérations monadiques dans std::optional |
Exemple
#include <charconv> #include <iomanip> #include <iostream> #include <optional> #include <ranges> #include <string> #include <string_view> #include <vector> std::optional<int> to_int(std::string_view sv) { int r{}; auto [ptr, ec]{std::from_chars(sv.data(), sv.data() + sv.size(), r)}; if (ec == std::errc()) return r; else return std::nullopt; } int main() { using namespace std::literals; const std::vector<std::optional<std::string>> v { "1234", "15 foo", "bar", "42", "5000000000", " 5", std::nullopt, "-43" }; for (auto&& x : v | std::views::transform( [](auto&& o) { // impression de débogage du contenu de l'optional<string> d'entrée std::cout << std::left << std::setw(13) << std::quoted(o.value_or("nullopt")) << " -> "; return o // si l'optional est nullopt, le convertir en optional avec une chaîne "" .or_else([]{ return std::optional{""s}; }) // flatmap des chaînes vers des entiers (créant des optionaux vides en cas d'échec) .and_then(to_int) // mapper int vers int + 1 .transform([](int n) { return n + 1; }) // reconvertir en chaînes .transform([](int n) { return std::to_string(n); }) // remplacer tous les optionaux vides laissés par // and_then et ignorés par transforms par "NaN" .value_or("NaN"s); })) std::cout << x << '\n'; }
Sortie :
"1234" -> 1235 "15 foo" -> 16 "bar" -> NaN "42" -> 43 "5000000000" -> NaN " 5" -> NaN "nullopt" -> NaN "-43" -> -42
Voir aussi
|
renvoie la valeur contenue si disponible, une autre valeur sinon
(fonction membre publique) |
|
|
(C++23)
|
renvoie un
optional
contenant la valeur transformée si elle existe, ou un
optional
vide sinon
(fonction membre publique) |
|
(C++23)
|
renvoie l'
optional
lui-même s'il contient une valeur, ou le résultat de la fonction donnée sinon
(fonction membre publique) |