gpt4 book ai didi

c++ - range-v3 中的 view_closure 是什么?

转载 作者:行者123 更新时间:2023-12-05 01:07:41 26 4
gpt4 key购买 nike

在这样的情况下:

auto pow = [](int i) {return i * i; };
auto closure = ranges::views::transform(pow);

closure 似乎是一个 view_closure。我确实明白最后一行没有多大意义,因为变换没有应用到任何地方。 实际上,我也可以将 vector x 传递到 closure 中,它既可以编译又可以正常工作

但是,什么是 View 闭包?它是一个期望在某处应用的“类似函数”的对象吗?它的语义是什么?

我找到了 this来自 Eric Niebler 的 range-v3 源代码,但没有任何文档在其他地方指定它。

我什至不知道 view_closure 是供内部使用还是供用户使用。

最佳答案

range-v3 中的 view_closure 类模板是 C++20 中成为 range adaptor closure object 的实现策略概念:

A range adaptor closure object is a unary function object that accepts a viewable_range argument and returns a view. For a range adaptor closure object C and an expression R such that decltype((R)) models viewable_­range, the following expressions are equivalent and yield a view:

C(R)
R | C

Given an additional range adaptor closure object D, the expression C | D is well-formed and produces another range adaptor closure object such that the following two expressions are equivalent:

R | C | D
R | (C | D)

transform(f) 的结果是一个范围适配器闭包对象,您可以通过管道将其应用于 viewable_range 作为 r | transform(f) 或通过调用 transform(f)(r),其中任何一个都会为您提供某种 transform_view 适配器。

更广泛地说,transform 本身是一个 范围适配器对象,它的定义方式使得 transform(f) 为您提供范围适配器闭包对象使得 transform(r, f), r | transform(f)transform(f)(r) 都是等价的。

view_closure,类模板,对于确保这样的东西有效:

auto adaptor = transform(f) | filter(g) | chunks(n);

也就是说,您可以在没有范围的情况下构建管道,其结果是范围适配器闭包对象,然后您可以将其应用于范围 - r |适配器 相当于 r |变换(f) |过滤器(g) | chunks(n) 相当于 chunks(filter(transform(r, f), g), n).

该类模板主要影响 operator| 的作用,等等。只有在创建自己的范围适配器时才需要使用它,否则作为范围用户不需要关心它。

关于c++ - range-v3 中的 view_closure 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67002962/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com