์ด์ ์ ์ธ ๊ฐ๋ฐ์๋ค์ด do ํ๊ธฐ๋ฒ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ C++ ์ ๋๋ ์ดํฐ๋ฅผ ์์ฑํ๋๋ฐ, ์ด ์ ๋๋ ์ดํฐ ์ญ์ ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ตฌํ์ MIT ๋ผ์ด์ ์ค ํ์ ์คํ ์์ค๋ก ์ ๊ณต๋ฉ๋๋ค. // do ํ๊ธฐ๋ฒ ๋ฏธ์ฌ์ฉ: auto result = ::bind(mx, [&](auto&& x) { return ::bind(my, [&](auto&& y) { return make_value(x + y); }); }); // do ํ๊ธฐ๋ฒ ์ฌ์ฉ: auto result = DO( LET x IS(mx); LET y IS(my); return make_value(x + y); );
์ ๋๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ ์์ ์ฝ๋: // ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ ์๋ ์ ๋๋ ์ดํฐ constexpr auto my_generator() { return GENERATOR((int i), (.i = 0), // ๋๋ ์์ฑ๊ธฐ ํ์ YIELD(42); WHILE(i != 10) ( YIELD(i); ++i; ) return end (); ); } 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); // [42, 3, 4, 5, 6, 7, 8, 9] ์ถ๋ ฅ /* for (auto i : gen) { std::println("{}", i); } */ }
์ ๋๋ ์ดํฐ๋ ๋ฐ์ธ๋ ํจ์์ ๊ธฐ๋ณธ ํจ์์ธ `generator_continuation`์ผ๋ก ์ ์๋ฉ๋๋ค. ์ด์ ๊ฐ ๋ฐ์ธ๋๋ ๋ชจ๋ ๊ฒ์ ํ ๋ฒ์ ํ๊ฐํ๋ ๋์ ์ง์ฐ ์คํ๋ฉ๋๋ค. ์ฝ๋๋ ๋ ๊ฐ์ง ๋ฒ์ ์ ์ ๊ณตํฉ๋๋ค. ํ๋๋ ๊ฐ์ ํจ์ ๊ธฐ๋ฐ์ด๊ณ , ๋ค๋ฅธ ํ๋๋ `std::variant`์ ์ ์ฌํ๊ฒ ํ์
๋ฃจํํ์ ์ฌ์ฉํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํจ ๋ฒ์ ์
๋๋ค.
์ถ์ฒ : opennet.ru
