C++์—์„œ ๋งคํฌ๋กœ๋ฅผ ์ด์šฉํ•œ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ ๊ตฌํ˜„ํ•˜๊ธฐ

์—ด์ •์ ์ธ ๊ฐœ๋ฐœ์ž๋“ค์ด 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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€