使ってみました。
Boostのlibs/asio/example/http/server4にあるcoroutine.hppとyield.hppを持ってきます。
まず、非メンバ関数でのyield。
#include <iostream> #include "yield.hpp" int foo(coroutine& coro) { reenter(coro) { yield return 1; yield return 2; } } int main() { coroutine coro; std::cout << foo(coro) << std::endl; std::cout << foo(coro) << std::endl; }
1 2
メンバ関数内でのyield。coroutineクラスを継承してreenterにthisを渡すか:
#include <iostream> #include "yield.hpp" struct functor : coroutine { int operator()() { reenter(this) { yield return 1; yield return 2; } } }; int main() { functor f; std::cout << f() << std::endl; std::cout << f() << std::endl; }
1 2
corutine型の変数をメンバにもってreenterに渡すか。
#include <iostream> #include "yield.hpp" struct functor { int operator()() { reenter(coro_) { yield return 1; yield return 2; } } private: coroutine coro_; }; int main() { functor f; std::cout << f() << std::endl; std::cout << f() << std::endl; }
1 2
便利べんり。
【参照】
A potted guide to stackless coroutines