Можно ли вложить сопрограммы с помощью Boost.Coroutine?

Я хотел бы вызвать сопрограмму, когда уже в сопрограмме. Возможно ли использовать Boost.Coroutine?

6

Решение

Да, это просто как:

#include <iostream>
#include <boost/coroutine/coroutine.hpp>

typedef boost::coroutines::coroutine<int()> generator;

void bar(generator::caller_type& yield)
{
for (std::size_t i = 100; i < 110; ++i)
yield(i);
}

void foo(generator::caller_type& yield)
{
for (std::size_t i = 0; i < 10; ++i)
{
generator nested_gen(bar);
while (nested_gen)
{
std::cout << "foo: " << nested_gen.get() << std::endl;
nested_gen();
}
yield(i);
}
}

int main()
{
generator gen(foo);
while (gen)
{
std::cout << "main: " << gen.get() << std::endl;
gen();
}
return 0;
};

Редактировать:
С Boost> = 1,56

#include <iostream>
#include <boost/coroutine/asymmetric_coroutine.hpp>

using generator = typename boost::coroutines::asymmetric_coroutine<std::size_t>::pull_type;
using yield_type = typename boost::coroutines::asymmetric_coroutine<std::size_t>::push_type;

void bar(yield_type& yield)
{
for (std::size_t i = 100; i < 110; ++i)
yield(i);
}

void foo(yield_type& yield)
{
for (std::size_t i = 0; i < 10; ++i)
{
generator nested_gen{bar};
while (nested_gen)
{
std::cout << "foo: " << nested_gen.get() << '\n';
nested_gen();
}
yield(i);
}
}

int main()
{
generator gen{foo};
while (gen)
{
std::cout << "main: " << gen.get() << '\n';
gen();
}
return 0;
};
11

Другие решения

Других решений пока нет …