Nadšenci napsali generátory v C++ založené na notaci „do“, která je také vytvořena s makry. Implementace je open source pod licencí MIT. // Bez notace „do“ auto result = ::bind(mx, [&](auto&& x) { return ::bind(my, [&](auto&& y) { return make_value(x + y); }); }); // S notací „do“ auto result = DO( LET x IS(mx); LET y IS(my); return make_value(x + y); );
Příklad kódu s generátory: // Generátory volné alokace constexpr auto my_generator() { return GENERATOR((int i), (.i = 0), // nebo GENERÁTOR_MEZER YIELD(42); WHILE(i != 10) (YIELD(i); ++i; ) vrátit konec (); ); } static_assert(std::ranges::equal(my_generator(), std::array{42, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9})); int main() { auto gen = my_generator(); gen.i = 3; std::println("{}", gen); // vypíše [42, 3, 4, 5, 6, 7, 8, 9] /* for (auto i : gen) { std::println("{}", i); } */ }
Generátory jsou definovány pomocí funkce bind a základní funkce generator_continuation. Každá bind se nyní provádí líně, místo aby se vše vyhodnocovalo najednou. Kód nabízí dvě verze: jednu založenou na virtuálních funkcích a druhou založenou na analogii std::variant s využitím typových smyček pro vyšší výkon.
Zdroj: opennet.ru
