gpt4 book ai didi

c++ - 我可以通过管道传输 range-v3 累积吗?

转载 作者:行者123 更新时间:2023-12-02 02:37:19 25 4
gpt4 key购买 nike

我发现 3 年前的旧问题说,一般来说这是不可能的,但我真的很想通过管道进行累积,因为它在某些情况下非常好,例如:

const double val = data | transform(...) | accumulate (...);

所以我想知道 range-v3/C++20 范围中是否添加了某些内容,使我能够做到这一点。

最佳答案

没有。

唯一可以通过管道输入的是范围适配器——接收范围并生成范围的算法。接受范围并返回单个对象的算法(也称为变形)在 range-v3 或 C++20 范围中不可通过管道传输。

你必须这样写:

const double val = accumulate(data | transform(...));
<小时/>

至于为什么accumulate类似的算法将很难成为 | -有能力的。考虑一下我们想要 algo(rng, x)rng | algo(x)意思是一样的。此外,考虑“总调用”algo(rng, x)可以完全受到约束(因为您拥有所有信息),而“部分调用”algo(x)除了极少数情况外,基本上在所有情况下都必须完全不受约束......基本上大致采用 auto&&...

问题是,当第二个参数 x 时,我们必然会遇到歧义。 ,也可以是一个范围。如何区分意图是完全调用还是部分调用?

这是一个使用 string 的示例:

accumulate("hello"s, ""s)

这是一个总调用,使用默认的二元运算符 + - 这是字符串连接。其作用是迭代 char 范围内的元素。 s 并将它们一一添加到初始空字符串中。这是复制 string 的低效但正确的方法。 。您最终得到值 "hello"s .

它的等效管道版本怎么样?

"hello"s | accumulate(""s)

右边是什么意思?可以accumulate(""s)是否被视为全调用?是的,它可以!默认的第二个参数是 char()默认的第三个参数是 plus() ,这工作正常,所以 accumulate(""s) 的值是整数 0 - 使整个表达式格式错误,因为没有 operator|(string, int)

如何使用 accumulate 来完成这项工作? ?

关于c++ - 我可以通过管道传输 range-v3 累积吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59130785/

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