Как сделать повторяющуюся подпрограмму Boost?

я использую Ускоренная библиотека сопрограмм, и мне нужен мой сопрограмм, чтобы вернуться.

Это означает, что я должен быть в состоянии запустить сопрограмму с начала многократно.

Какие есть варианты?

Мой текущий обходной путь — каждый раз заново создавать свежую сопрограмму:

boost::coroutines::coroutine<int>::pull_type *source = new boost::coroutines::coroutine<int>::pull_type(
[&](boost::coroutines::coroutine<int>::push_type& sink){
sink(0);
cout << "Hello world!" << endl;
});
(*source)();

source = new boost::coroutines::coroutine<int>::pull_type(
[&](boost::coroutines::coroutine<int>::push_type& sink){
sink(0);
cout << "Hello world!" << endl;
});
(*source)();

source = new boost::coroutines::coroutine<int>::pull_type(
[&](boost::coroutines::coroutine<int>::push_type& sink){
sink(0);
cout << "Hello world!" << endl;
});
(*source)();

1

Решение

Поскольку сопрограммы из boost.coroutine переполнены стеком, их нельзя запускать несколько раз.
Из вашего примера не ясно, что вы хотите сделать:

  • печать «Привет, мир!» Несколько раз -> использовать цикл внутри coro-fn
  • какая-то обратная проверка / контрольная точка -> может быть сделана с coroutiens, но требует дополнительной работы
1

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

Я вообще не вижу, что плохого в создании свежей сопрограммы каждый раз — они не дорогие в создании.

Если у вас в сопрограмме много данных, поэтому их создание дорого, переместите все это в некоторый класс данных и передайте ссылку на него в сопрограмму.

0