Visual Studio 2015 поддерживает сопрограммы, поэтому я могу сделать это, например:
#include<iostream>
#include<experimental/generator>
auto gen(int increment) {
int i=1;
while(true) {
for(int j=0; j<i; j++) yield j;
i+=increment;
}
}int main()
{
auto Coroutine1=gen(1);
auto Coroutine2=gen(2);
auto Iterator1=Coroutine1.begin();
auto Iterator2=Coroutine2.begin();
for(int k=0; k<10; k++) {
std::cout<<(*Iterator1)<<" "<<(*Iterator2)<<endl;
++Iterator1;
++Iterator2;
}
который производит этот вывод:
0 0
0 0
1 1
0 2
1 0
2 1
0 2
1 3
2 4
3 0
Это несколько надуманный пример, просто чтобы показать случай, который невозможно реализовать без сопрограмм.
Теперь мой вопрос: как я могу поместить «yield» в подпрограмму? Следующий код не компилируется, но в идеале я хочу что-то вроде этого:
auto genSubroutine(int current){
for(int j=0; j<current; j++) yield j;
}
auto gen(int increment) {
int i=1;
while(true) {
genSubroutine(i);
i+=increment;
}
}
Задача ещё не решена.
Других решений пока нет …