C++20 range-v3 和 zip_with 视图适配器

use*_*370 3 c++ range-v3 c++20

使用像我这样的惰性范围组合器,ranges::view::reverse可以为其提供单个参数(例如reverse(iota(0,3)));或者我可以使用它来调整范围operator|(例如iota(0,3) | reverse)。这种奇偶性看起来相当有规律。下面是零视图、一元视图和二元视图的示例:

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Bar*_*rry 6

这是 range-v3 中非常常见的约定,r | adapter(x)adapter(r, x). (事实上​​,甚至还有一种编程语言 Elixir,实际上可以直接r |> adapter(x)进行计算adapter(r, x))。

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

zip_with(std::plus{},iota(0,9),iota(0,9))
Run Code Online (Sandbox Code Playgroud)

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

std::plus{} | zip_with(iota(0,9),iota(0,9))
Run Code Online (Sandbox Code Playgroud)

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