#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
концепция?
Вы неправильно поняли, что 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) {})
Других решений пока нет …