我发现 3 年前的旧问题说一般来说这是不可能的,但我真的很想累积,因为在某些情况下它非常好,例如:
const double val = data | transform(...) | accumulate (...);
Run Code Online (Sandbox Code Playgroud)
所以我想知道是否在 range-v3/C++20 范围中添加了一些东西,使我能够做到这一点。
使用 g++-std=C++20或更高版本,可以编译以下内容(假设 vec 是适当类型的向量):
auto isEven = [](auto i) { return i % 2 == 0; }
auto filtered = vec | std::views::filter(isEven);
auto minEven = std::ranges::min_element(filtered);
Run Code Online (Sandbox Code Playgroud)
但以下情况则不然( 的参数数量错误std::ranges::__min_element_fn):
auto isEven = [](auto i) { return i % 2 == 0; }
auto minEven = vec | std::views::filter(isEven) | std::ranges::min_element();
Run Code Online (Sandbox Code Playgroud)
这里的理由是什么?我如何知道哪些与系列相关的漂亮设施可以合并到管道中?(后者是我凭直觉写的;从概念上讲,这似乎是执行此操作的“新范围方式”。)