C++20 range-v3 和 zip_with View 适配器

标签 c++ c++20 range-v3

使用惰性范围组合器,例如 ranges::view::reverse 我可以为它提供一个参数(例如 reverse(iota(0,3)));或者我可以使用它来调整使用 operator| 的范围(例如 iota(0,3) | reverse)。这种奇偶校验看起来很正常;以下是无效、一元和二元 View 的示例:

#include <range/v3/all.hpp>
#include <iostream>

int main(int argc, char *argv[])
{
  using namespace ranges::view;
  std::cout <<        (iota(0,9) | reverse)      << ' ';
  std::cout << reverse(iota(0,9))                << '\n';

  std::cout <<        (iota(0,9) | chunk(4))     << ' ';
  std::cout <<   chunk(iota(0,9),4)              << '\n';

  std::cout <<        (iota(0,9) | replace(5,0)) << ' ';
  std::cout << replace(iota(0,9),5,0)            << '\n';
  return 0;
}

我注意到 ranges::view::zip_with 组合器只能用于第二种(非适配器)形式;例如 zip_with(std::plus{},iota(0,9),iota(0,9))。是否有技术原因导致 zip_with 无法定义为与 operator| 一起使用? ranges-v3 库中惰性范围组合子的参数是否有规范的排序?

我正在使用 ranges-v3 库的最新版本 (v0.4.0)。

最佳答案

r | 在 range-v3 中是一个很常见的约定adapter(x)adapter(r, x) 意思相同。 (事实上​​什至还有一种编程语言 Elixir,r |> adapter(x) 实际上直接计算为 adapter(r, x)

zip_with 的问题在于,正如您指出的那样,用法是:

zip_with(std::plus{},iota(0,9),iota(0,9))

这意味着与 operator| 的逻辑分离将是:

std::plus{} | zip_with(iota(0,9),iota(0,9))

但是,那不是左侧的范围。那是一些二元运算符。 range-v3 就是关于链接范围。在所有其他情况下,它是显示在 | 左侧的范围。因此,虽然这在技术上并不难做到,但它似乎是一种截然不同的事情。

关于C++20 range-v3 和 zip_with View 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55399887/

相关文章:

c++ - 未知的 CUDA 错误 : Gpu API call

c++ - 在二进制数据(密文)上使用 CryptoPP::Base64Encoder

c++ - 非类型模板参数可以是 "void*"类型吗?

c++ - 如何从过滤后的数据创建笛卡尔积范围?

c++ - Range-v3运算符重载以编写较短的代码

c++ - void(int) 和 void(*)(int) 有什么区别?

c++ - 如何在汇编函数中将元素数组作为参数传递时转发 ARM 寄存器的地址指针

C++ 为什么受约束的算法(例如 std::ranges::merge)也返回输入范围的结尾?

c++ - 非模板函数尾随要求子句的编译器差异

c++ - 算法能否与表达式模板兼容?