Generatoare Asincrone și Coroutine cu std::generator în C++23 în C++

Ghid de utilizare a tipului std::generator în C++23: crearea facilă de coroutine generatoare cu evaluare leneșă (lazy evaluation) prin co_yield, compatibilitate nativă cu algoritmii std::ranges și buclele for bazate pe intervale.

Sintaxă
#include <generator> | std::generator<int> fibonacci() { co_yield a; }

Deși C++20 a introdus suportul nativ de compilator pentru coroutine (co_await, co_yield), biblioteca standard nu a furnizat niciun tip gata de utilizat pentru generatoare leneșe de date, obligând dezvoltatorii să scrie sute de linii de cod boilerplate pentru promise_type. Standardul C++23 a remediat această lipsă introducând std::generator<T>: o coroutină sincrónica care produce secvențe infinite sau finite de valori evaluate doar la cerere (Lazy Evaluation).

Generarea șirului Fibonacci la cerere cu std::generator
#include <generator>
#include <ranges>
#include <print>

// Coroutină generatoare infinită (memorează doar două numere în frame-ul de coroutină):
std::generator<uint64_t> generatorFibonacci() {
    uint64_t a = 0, b = 1;
    while (true) {
        co_yield a; // Oprește execuția și returnează valoarea către apelant!
        auto urmator = a + b;
        a = b;
        b = urmator;
    }
}

int main() {
    // std::generator este compatibil 100% cu std::ranges și conductele views:
    // Extragem primele 10 numere pare din șirul Fibonacci:
    auto numere = generatorFibonacci()
        | std::views::filter([](uint64_t n) { return n % 2 == 0; })
        | std::views::take(10);

    for (auto n : numere) {
        std::print("{} ", n);
    }
    std::println("");
    return 0;
}