Generatorių su makrokomandomis įdiegimas C++ kalba

Entuziastai C++ kalboje parašė generatorius, pagrįstus „do“ notacija, kuri taip pat atliekama naudojant makrokomandas. Įgyvendinimas yra atvirojo kodo pagal MIT licenciją. // Be „do“ notacijos auto result = ::bind(mx, [&](auto&& x) { return ::bind(my, [&](auto&& y) { return make_value(x + y); }); }); // Su „do“ notacija auto result = DO( LET x IS(mx); LET y IS(my); return make_value(x + y); );

Kodo su generatoriais pavyzdys: // Laisvųjų generatorių paskirstymas constexpr auto my_generator() { return GENERATOR((int i), (.i = 0), // or GENERATORIAUS_SPRAGOS DERLIUS(42); WHILE(i != 10) (DERLIUS(i); ++i; ) return pabaiga (); ); } 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); // spausdina [42, 3, 4, 5, 6, 7, 8, 9] /* for (auto i : gen) { std::println("{}", i); } */ }

Generatoriai apibrėžiami naudojant „bind“ funkciją ir bazinę funkciją „generator_continuation“. Kiekvienas „bind“ dabar vykdomas tingiai, o ne įvertinamas viskas iš karto. Kode pateikiamos dvi versijos: viena pagrįsta virtualiomis funkcijomis, o kita – „std::variant“ analogu, naudojant tipų spragas didesniam našumui.

Šaltinis: opennet.ru

Добавить комментарий