0Pricing
C++ Academy · Lección

Implementación de un generador sencillo

Construya una coroutine generadora que produzca valores de forma perezosa.

Implementación de un generador sencillo es una lección gratuita de C++ Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

Generadores como corrutinas

Un generador es una corrutina que produce valores de uno en uno. Cada llamada al generador produce el siguiente valor y suspende la ejecución.

El tipo generador

Defina una clase con un promise_type anidado. El compilador lo utiliza para administrar el estado de la corrutina.

template <typename T>
struct Generator {
    struct promise_type {
        T current_value;

        Generator get_return_object() {
            return Generator{std::coroutine_handle<promise_type>::from_promise(*this)};
        }
        std::suspend_always initial_suspend() { return {}; }
        std::suspend_always final_suspend() noexcept { return {}; }
        void return_void() {}
        std::suspend_always yield_value(T value) {
            current_value = value;
            return {};
        }
        void unhandled_exception() { std::terminate(); }
    };

    std::coroutine_handle<promise_type> h;
    // ... constructors, destructor, next() ...
};

Uso del generador

Una vez definidos, los generadores resultan similares a yield de Python.

Generator<int> counting() {
    int n = 0;
    while (true) co_yield n++;
}

auto g = counting();
for (int i = 0; i < 5; ++i) {
    std::cout << g.next() << " ";
}
// 0 1 2 3 4

coroutine_handle

El compilador devuelve un std::coroutine_handle. Representa la corrutina suspendida: puede llamar a resume(), destroy() o comprobar done().

Puntos de suspensión

Cada co_yield suspende la ejecución. Cuando quien llama invoca resume(), la ejecución continúa hasta la siguiente suspensión o hasta el final de la corrutina.

initial_suspend y final_suspend

Dos puntos de personalización:

  • initial_suspend — devuelva suspend_always para un inicio diferido o suspend_never para un inicio inmediato
  • final_suspend — controla la limpieza. Normalmente se utiliza suspend_always para garantizar una destrucción adecuada

std::generator de C++23

C++23 añadió std::generator en <generator>. Ya no necesita crear el tipo manualmente en los casos habituales.

#include <generator>

std::generator<int> counting() {
    int n = 0;
    while (true) co_yield n++;
}

for basado en rangos

Si el tipo generador admite begin/end, el for basado en rangos funciona directamente.

for (int x : counting()) {
    if (x >= 10) break;
    std::cout << x;
}

Semántica pull frente a push

Los generadores se basan en pull: quien llama controla la iteración. Las corrutinas basadas en push son tareas asíncronas.

Casos de uso

Los generadores son ideales para:

  • Secuencias diferidas (Fibonacci, números primos y lectores de archivos línea por línea)
  • Transmitir datos sin materializarlos
  • Recorrer estructuras con forma de árbol

Consideraciones sobre la memoria

El marco de corrutina se asigna en el montón de forma predeterminada. El compilador puede eliminar esta asignación cuando la inserción de código lo permite; mida el rendimiento cuando sea importante.

Bibliotecas para explorar

Para aprender, cppcoro, de Lewis Baker, ofrece tipos de generador y tarea bien documentados. Boost.Asio proporciona E/S compatible con corrutinas. A partir de C++23 se añade compatibilidad con la biblioteca estándar.

Comprobación rápida

¿Cuál es el tipo de la biblioteca estándar de C++23 para las corrutinas generadoras?

Resumen

Una corrutina generadora produce valores de forma diferida mediante co_yield. Impleméntela con una clase que contenga un promise_type. C++23 estandarizó std::generator. Los generadores destacan en secuencias diferidas y transmisión de datos.

Preguntas frecuentes

¿La lección «Implementación de un generador sencillo» es gratis?

Sí — el texto completo de «Implementación de un generador sencillo» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Implementación de un generador sencillo»?

Construya una coroutine generadora que produzca valores de forma perezosa. Practicas C++ Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar C++ Academy?

No se requiere experiencia previa. C++ Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Implementación de un generador sencillo»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de C++ Academy?

Sí. Cada lección de C++ Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Conceptos de coroutines: co_await, co_yield y co_return
  2. Implementación de un generador sencillo
  3. Tareas asíncronas y tipos awaiter
  4. Asignación del marco de una coroutine
← Volver a C++ Academy