Espacios de nombres
Variantes
Acciones

std::noop_coroutine

De cppreference.com
< cpp‎ | coroutine
 
 
Biblioteca de servicios
 
Apoyo de corrutinas
Rasgos de corrutinas
Identificador de corrutina
Corrutinas no operativas
noop_coroutine
(C++20)
En espera triviales
 
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.

Contenido

[editar] Parámetros

(Ninguno)

[editar] Valor de retorno

Un identificador de corrutina, std::noop_coroutine_handle, que se refiere a una corrutina no operativa.

[editar] 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.

[editar] 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


[editar] Véase también

Usado para corrutinas que no tienen efectos observables
(clase) [editar]
std::coroutine_handle<std::noop_coroutine_promise>, destinado a referirse a una corrutina no operativa
(typedef) [editar]