Почему для 'range :: view :: for_each` требуется, чтобы функтор возвращал модель концепции `InputRange`? - PullRequest
0 голосов
/ 17 ноября 2018
#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 концепции?

1 Ответ

0 голосов
/ 17 ноября 2018

Вы неправильно понимаете, что такое 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) {})
...