#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
概念的模型?
答案 0 :(得分:6)
您误解了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) {})