c++ 我可以管道到范围-v3积累?

qmelpv7a  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(83)

我发现3y前的老问题说,一般来说,这是不可能的,但我真的很想管道积累,因为它在某些情况下是相当不错的,例如:

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

字符串
所以我想知道range-v3/C ++20 ranges是否添加了一些东西,使我能够做到这一点。

bvjxkvbb

bvjxkvbb1#


你唯一可以导入的东西是范围适配器--接受一个范围并产生一个范围的算法。接受一个范围并返回一个对象的算法(也称为变形)在range-v3或C++20范围中是 * 不可导入的。
你要这样写:

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

字符串
至于为什么accumulate和类似的算法将努力成为|-able。考虑到我们希望algo(rng, x)rng | algo(x)表示相同的东西。进一步,考虑“总呼叫”algo(rng, x)可以被完全约束(因为你有所有的信息)而“部分调用”algo(x)基本上在所有情况下都是完全不受约束的,但很少有情况.
问题是,当第二个参数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中实现此功能?

相关问题