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

时间:2019-03-28 14:18:16

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

使用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;
}

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

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

1 个答案:

答案 0 :(得分:2)

在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))

这意味着与operator|的逻辑分隔为:

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

但是,这不是左侧的范围。那是一些二进制运算符。 range-v3都是关于链接 range 的。在其他所有情况下,它都是出现在|左侧的范围。因此,尽管在技术上并不困难,但这似乎是一种完全不同的事情。