xml*_*lmx 5 c++ standards concept range-v3 c++20
#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
}
Run Code Online (Sandbox Code Playgroud)
该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)); });
Run Code Online (Sandbox Code Playgroud)
为每一个元件返回的范围是{0},{0, 1},{0, 1, 2}分别.的res将被压平的一个:{0, 0, 1, 0, 1, 2}
对应的std::for_each是ranges::for_each:
ranges::for_each(coll, [] (auto) {})
Run Code Online (Sandbox Code Playgroud)