std::transform
std::copy_if
Вместо того чтобы делать цикл который делай не пойми что можно запилить набор функциональных штук выше, которые выполнят нашу задачу
Удобно их собирать в некоторые “контейнеры” — view. Самый внешний такой вью называется Ranges v3 (оно же библиотека)
Насколько понял, оно считает это все постепенно, а не все сразу (намек на корутины?), но можно сказать посчитай все сразу.
Пусть у нас есть такая последовательность вызовов h(g(f(...)))
Pull model (это вьюхи)
Стратегия следующая: внешний цикл хочет прочитать данные у h, h в свою очередь спрашивает их у g, а потом с этими данными что-то делает. g же спрашивает их у f и т. д.
Push model (а это уже не вьюха, это что-то другое)
Другая стратегия: Мы говорим f “запиши нам данные”, но f ничего не хранит и предает их в g, g что-то тоже ничего не хранит и передает их в h и т. д.
Если мы хотим дерево, то если g зависит от двух f, то push нереализуема, а если g разбивается на две h, то неосуществима pull.
Например:
cin работает по pull модели
cout работает по push модели
Основаны на том, что компилятор за нас будет переписывать код
generator<int> tenInts() { for (int i = 0; i < 10; ++i) { cout << "Next: " << i; co_yield i; // Точка паузы + return } }
int main() { genetaror<int> g = tenInts(); for (int v : g) { // Do something } }
Позволяет упростить асинхронные операции
future<path> cacheUrl(string url) { cout << "Downloading url"; string text = co_await downloadingAsync(url);cout <span class="token operator"><<</span> <span class="token string">"Saving in cache"</span><span class="token punctuation">;</span> path p <span class="token operator">=</span> <span class="token function">randomFileName</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> co_await <span class="token function">saveInCacheAsync</span><span class="token punctuation">(</span>p<span class="token punctuation">,</span> text<span class="token punctuation">)</span><span class="token punctuation">;</span> co_return p<span class="token punctuation">;</span>
}
Как корутина переписывается компилятором
ret_type answer() { struct frame_type { generator<int>::promise_type promise; //local //resume point } frame_type *f = create_frame(); auto &p = new(ret_address) ret_tupe(p.get_return_object()); co_await p.initial_suspend(); try { p.return_value(42); } catch (...) {<span class="token punctuation">}</span>
}
P.s
Эту херню так просто не поймешь
Гор Нишанов, C++ Coroutines – a negative overhead abstraction - вот что посмотреть надо