std::noop_coroutine
| Definido en el archivo de encabezado <coroutine>
|
||
std::noop_coroutine_handle noop_coroutine() noexcept; |
(desde C++20) | |
Devuelve un identificador de corrutina que se refiere a una corrutina no operativa.
Si ya ha habido un estado de corrutina de corrutina no operativa, no está especificado si una llamada subsecuente a noop_coroutine devuelve un identificador de corrutina previamente obtenido, o un identificador de corrutina que se refiere a un nuevo estado de corrutina de corrutina no operativa.
Parámetros
(Ninguno)
Valor de retorno
Un identificador de corrutina, std::noop_coroutine_handle, que se refiere a una corrutina no operativa.
Notas
Los valores de retorno de distintas llamadas a noop_coroutine pueden o no compararse como iguales.
noop_coroutine puede devolver solamente un identificador de corrutina, noop_coroutine_handle, que se refiere a un objeto estado de corrutina sin iniciar una corrutina.
Ejemplo
#include <coroutine>
#include <utility>
#include <iostream>
template<class T>
struct tarea {
struct tipo_promesa {
auto get_return_object() {
return tarea(std::coroutine_handle<tipo_promesa>::from_promise(*this));
}
std::suspend_always initial_suspend() { return {}; }
struct esperador_final {
bool await_ready() noexcept { return false; }
void await_resume() noexcept {}
std::coroutine_handle<> await_suspend(std::coroutine_handle<tipo_promesa> h) noexcept {
// esperador_final::await_suspend se llama cuando la ejecución de la
// corrutina actual (referida por 'h') está a punto de terminar.
// Si la corrutina actual se reanudó por otra corrutina vía
// co_await get_task(), se ha almacenado un identificador a esa corrutina
// como h.promise().previous. En ese caso, se devuelve el identificador para reanudar
// la corrutina previa.
// De lo contrario, se devuelve noop_coroutine(), cuya reanudación no hace nada.
auto previous = h.promise().previous;
if (previous) {
return previous;
} else {
return std::noop_coroutine();
}
}
};
esperador_final final_suspend() noexcept { return {}; }
void unhandled_exception() { throw; }
void return_value(T value) { result = std::move(value); }
T result;
std::coroutine_handle<> previous;
};
tarea(std::coroutine_handle<tipo_promesa> h) : corrutina(h) {}
tarea(tarea&& t) = delete;
~tarea() { corrutina.destroy(); }
struct esperador {
bool await_ready() { return false; }
T await_resume() { return std::move(corrutina.promise().result); }
auto await_suspend(std::coroutine_handle<> h) {
corrutina.promise().previous = h;
return corrutina;
}
std::coroutine_handle<tipo_promesa> corrutina;
};
esperador operator co_await() { return esperador{corrutina}; }
T operator()() {
corrutina.resume();
return std::move(corrutina.promise().result);
}
private:
std::coroutine_handle<tipo_promesa> corrutina;
};
tarea<int> captar_aleatorio() {
std::cout << "en captar_aleatorio()\n";
co_return 4;
}
tarea<int> prueba() {
tarea<int> v = captar_aleatorio();
tarea<int> u = captar_aleatorio();
std::cout << "en prueba()\n";
int x = (co_await v + co_await u);
co_return x;
}
int main() {
tarea<int> t = prueba();
int result = t();
std::cout << result << '\n';
}
Salida:
en prueba()
en captar_aleatorio()
en captar_aleatorio()
8
Véase también
(C++20) |
Usado para corrutinas que no tienen efectos observables (clase) |
(C++20) |
std::coroutine_handle<std::noop_coroutine_promise>, destinado a referirse a una corrutina no operativa (typedef) |