为什么 `ranges::view::for_each` 要求函子必须 return `InputRange` 概念的模型?
Why does `ranges::view::for_each` require the functor must return a model of the `InputRange` concept?
#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
错误信息:
To use view::for_each, the function F must return a model of the
InputRange concept.
std::for_each
接受了一个 returns void
的函子,为什么 ranges::view::for_each
要求函子必须 return [=17= 的模型]概念?
你误解了什么是view::for_each()
,它和std::for_each
完全不同。
view::for_each()
中的函子应该return另一个范围,那么最后的效果就是把所有的范围拉平成一个大范围
例如:
auto res = coll | view::for_each([](auto n){ return yield_from(view::ints(0, n)); });
每个元素的 returned 范围分别是 {0}
、{0, 1}
、{0, 1, 2}
。 res
将是扁平化的:{0, 0, 1, 0, 1, 2}
std::for_each
的对应词是ranges::for_each
:
ranges::for_each(coll, [] (auto) {})
#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
错误信息:
To use view::for_each, the function F must return a model of the InputRange concept.
std::for_each
接受了一个 returns void
的函子,为什么 ranges::view::for_each
要求函子必须 return [=17= 的模型]概念?
你误解了什么是view::for_each()
,它和std::for_each
完全不同。
view::for_each()
中的函子应该return另一个范围,那么最后的效果就是把所有的范围拉平成一个大范围
例如:
auto res = coll | view::for_each([](auto n){ return yield_from(view::ints(0, n)); });
每个元素的 returned 范围分别是 {0}
、{0, 1}
、{0, 1, 2}
。 res
将是扁平化的:{0, 0, 1, 0, 1, 2}
std::for_each
的对应词是ranges::for_each
:
ranges::for_each(coll, [] (auto) {})