Boost.Coroutine でジェネレータ その2
ちょっと変えてみた。
coroutine は std::shared_ptr で保持。
[ソース]
#include <boost/coroutine/coroutine.hpp> #include <iostream> #include <functional> #include <memory> std::function<int()> counter_generator(int start, int step){ typedef boost::coroutines::coroutine<int()> coroutine_type; auto coroutine = std::make_shared<coroutine_type>( [=](coroutine_type::caller_type& coroutine){ int value = start; coroutine(value); while( 1 ){ value += step; coroutine(value); } } ); return [=]() -> int{ auto result = coroutine->get(); (*coroutine)(); return result; }; } int main(){ auto counter = counter_generator(5, 2); for(int i = 0 ; i < 100 ; ++i){ std::cout << counter() << std::endl; } return 0; }
[出力]
5 7 9 11 13 15 17 19 21 23 25
なんかもっとすっきりした書き方があるのかしら。