การใช้งาน Generator ร่วมกับ Macro ในภาษา C++

ผู้ที่ชื่นชอบได้เขียนตัวสร้างในภาษา C++ โดยใช้สัญกรณ์ do ซึ่งสร้างขึ้นด้วยมาโคร การใช้งานนี้เป็นโอเพนซอร์สภายใต้ใบอนุญาต 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) ถูกกำหนดด้วยฟังก์ชัน bind และฟังก์ชันพื้นฐาน generator_continuation โดยแต่ละฟังก์ชัน bind จะถูกประมวลผลแบบไม่ทันที (lazily executed) แทนที่จะประเมินทุกอย่างพร้อมกัน โค้ดมีสองเวอร์ชัน: เวอร์ชันหนึ่งใช้ฟังก์ชันเสมือน (virtual functions) และอีกเวอร์ชันหนึ่งใช้รูปแบบเดียวกับ std::variant โดยใช้ Type Loopholes เพื่อประสิทธิภาพที่ดียิ่งขึ้น

ที่มา: opennet.ru

เพิ่มความคิดเห็น