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;
}