使用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)。
答案 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 的。在其他所有情况下,它都是出现在|
左侧的范围。因此,尽管在技术上并不困难,但这似乎是一种完全不同的事情。