Почему для ‘range :: view :: for_each` требуется, чтобы функтор возвращал модель концепции `InputRange`?

#include <vector>
#include <algorithm>
#include <range/v3/all.hpp>

using namespace ranges;

int main()
{
auto coll = std::vector{ 1, 2, 3 };
std::for_each(coll.begin(), coll.end(), [](auto){}); // ok
coll | view::for_each([](auto){}); // static_assert failure
}

static_assert сообщение об ошибке:

Чтобы использовать view :: for_each, функция F должна вернуть модель
Концепция InputRange.

std::for_each принимает функтор, который возвращает void, Почему ranges::view::for_each требуют, чтобы функтор должен вернуть модель InputRange концепция?

3

Решение

Вы неправильно поняли, что view::for_each() это полностью отличается от std::for_each,

Функтор в view::for_each() должен вернуть другой диапазон, тогда окончательный эффект состоит в том, что все диапазоны сглажены до большого диапазона.

Например:

auto res = coll | view::for_each([](auto n){ return yield_from(view::ints(0, n)); });

Возвращаемый диапазон для каждого элемента {0}, {0, 1}, {0, 1, 2} соответственно. res будет сплющенным: {0, 0, 1, 0, 1, 2}

Аналог std::for_each является ranges::for_each:

ranges::for_each(coll, [] (auto) {})
5

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

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