std::expected
De cppreference.com
Definido en el archivo de encabezado <expected>
|
||
template< class T, class E > class expected; |
(1) | (desde C++23) |
template< class T, class E > requires std::is_void_v<T> |
(2) | (desde C++23) |
La plantilla de clase std::expected
proporciona una forma de representar cualquiera de dos valores: un valor esperado de tipo T
o un valor no esperado de tipo E
. std::expected
nunca carece de valor.
1) La plantilla principal. Contiene el valor esperado o no esperado dentro de su propio almacenamiento. No se realiza ninguna asignación de memoria dinámica.
2) La especialización parcial void. Representa un valor void esperado o contiene el valor no esperado dentro de su propio almacenamiento. No se realiza ninguna asignación de memoria dinámica.
Un programa está mal formado si crea una instancia de un expected
con un tipo referencia, un tipo función o una especialización de std::unexpected. Además, T
no debe ser std::in_place_t o std::unexpect_t.
Contenido |
[editar] Parámetros de plantilla
T | - | El tipo de valor esperado. El tipo debe ser (posiblemente calificado cv) void o cumplir con los requerimientos de Destructible (en particular, no se permiten tipos array ni tipos referencia). |
E | - | El tipo del valor no esperado. El tipo debe cumplir con los requisitos de Destructible y debe ser un argumento de plantilla válido para std::unexpected (en particular, arrays, tipo no objeto, y no se permiten tipos calificados cv). |
[editar] Tipos anidados
Tipo miembro | Definición |
value_type
|
T
|
error_type
|
E
|
unexpected_type
|
std::unexpected<E>
|
[editar] Plantillas de alias miembro
Tipo | Definición |
rebind<U> | std::expected<U, error_type> |
[editar] Datos miembro
Dato miembro | Definición |
has_val
|
Si el objeto expected representa actualmente el valor esperado.(objeto miembro solo de exposición*) |
T val (solo plantila principal.)
|
El valor esperado (objeto miembro variante solo de exposición*) |
E unex
|
El valor no esperado. (objeto miembro variante solo de exposición*) |
[editar] Funciones miembro
Construye el objeto expected . (función miembro pública) | |
Destruye el objeto expected , así como su valor contenido. (función miembro pública) | |
Asigna el contenido. (función miembro pública) | |
Observadores | |
Accede al valor esperado. (función miembro pública) | |
Comprueba si el objeto contiene un valor esperado. (función miembro pública) | |
Devuelve el valor expected . (función miembro pública) | |
Devuelve el valor no esperado. (función miembro pública) | |
Devuelve el valor expected si está presente. De lo contrario, otro valor. (función miembro pública) | |
Devuelve el valor no esperado si está presente. De lo contrario, otro valor. (función miembro pública) | |
Operaciones monádicas | |
Devuelve el resultado de la función dada sobre el valor esperado si existe; de lo contrario, devuelve el propio expected . (función miembro pública) | |
Devuelve un objeto expected que contiene el valor esperado transformado si existe; de lo contrario, devuelve el propio expected . (función miembro pública) | |
Devuelve el propio expected si contiene un valor esperado; de lo contrario, devuelve el resultado de la función dada en el valor no esperado. (función miembro pública) | |
Devuelve el propio objeto expected si contiene un valor esperado; de lo contrario, devuelve un objeto expected que contiene el valor no esperado transformado. (función miembro pública) | |
Modificadores | |
Construye el valor esperado in situ. (función miembro pública) | |
Intercambia el contenido. (función miembro pública) |
[editar] Funciones no miembro
(C++23) |
Compara objetos de tipo expected . (plantilla de función) |
(C++23) |
Especializa el algoritmo std::swap. (función) |
[editar] Clases auxiliares
(C++23) |
Representado como un valor no esperado. (plantilla de clase) |
(C++23) |
Excepción que indica acceso verificado a un expected que contiene un valor no esperado. (plantilla de clase) |
(C++23) |
Etiqueta de construcción in situ para un valor no esperado en expected .(tag) |
[editar] Notas
Los tipos con la misma funcionalidad se llaman Result
en Rust y Either
en Haskell.
Macro de prueba de característica | Valor | Estándar | Comentario |
---|---|---|---|
__cpp_lib_expected |
202202L | (C++23) | Plantilla de clase std::expected y clases auxiliares.
|
202211L | (C++23) | Funciones monádicas para std::expected .
|
[editar] Ejemplo
Ejecuta este código
#include <cmath> #include <expected> #include <iomanip> #include <iostream> #include <string_view> enum class parse_error { invalid_input, overflow }; auto parse_number(std::string_view& str) -> std::expected<double, parse_error> { const char* begin = str.data(); char* end; double retval = std::strtod(begin, &end); if (begin == end) return std::unexpected(parse_error::invalid_input); else if (std::isinf(retval)) return std::unexpected(parse_error::overflow); str.remove_prefix(end - begin); return retval; } int main() { auto process = [](std::string_view str) { std::cout << "str: " << std::quoted(str) << ", "; if (const auto num = parse_number(str); num.has_value()) std::cout << "valor: " << *num << '\n'; // Si num no tenía valor, dereferenciar num // ocasionaría un comportamiento no definido, y // num.value() lanzaría std::bad_expected_access. // num.value_or(123) uses specified default value 123. else if (num.error() == parse_error::invalid_input) std::cout << "error: entrada no válida\n"; else if (num.error() == parse_error::overflow) std::cout << "error: desbordamiento\n"; else std::cout << "¡no esperado!\n"; // o invocar std::unreachable(); }; for (auto src : {"42", "42abc", "miau", "inf"}) process(src); }
Salida:
str: "42", valor: 42 str: "42abc", valor: 42 str: "miau", error: entrada no válida str: "inf", error: desbordamiento
[editar] Referencias
- El estándar C++23 (ISO/IEC 14882:2023):
- 22.8 Expected objects [expected]
[editar] Véase también
(C++17) |
Una unión discriminada con seguridad de tipo. (plantilla de clase) |
(C++17) |
Un envoltorio que puede o no mantener un objeto. (plantilla de clase) |