8
#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

4

1 回答 1

10

你误解了什么view::for_each(),它与std::for_each.

in 中的仿函数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_eachranges::for_each

ranges::for_each(coll, [] (auto) {})
于 2018-11-17T01:26:34.503 回答