Boost.Asioのコルーチンマクロ

使ってみました。
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