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


なんかもっとすっきりした書き方があるのかしら。