我发现3y前的老问题说,一般来说,这是不可能的,但我真的很想管道积累,因为它在某些情况下是相当不错的,例如:
const double val = data | transform(...) | accumulate (...);
字符串所以我想知道range-v3/C ++20 ranges是否添加了一些东西,使我能够做到这一点。
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
|
algo(rng, x)
rng | algo(x)
algo(x)
x
string
accumulate("hello"s, ""s)
型这是一个完全调用,它使用了默认的二元运算符+-这是字符串连接。它所做的是遍历char s范围内的元素,并将它们一个接一个地添加到初始空字符串中。这是一种低效但正确的复制string的方法。最终得到值"hello"s。它的等效管道版本呢?
+
char
"hello"s
"hello"s | accumulate(""s)
型右边是什么意思?accumulate(""s)可以被认为是一个总调用吗?是的,可以!默认的第二个参数是char(),默认的第三个参数是plus(),这很好,所以accumulate(""s)的值是整数0-使整个表达式格式错误,因为没有operator|(string, int)。如何在accumulate中实现此功能?
accumulate(""s)
char()
plus()
0
operator|(string, int)
1条答案
按热度按时间bvjxkvbb1#
号
你唯一可以导入的东西是范围适配器--接受一个范围并产生一个范围的算法。接受一个范围并返回一个对象的算法(也称为变形)在range-v3或C++20范围中是 * 不可导入的。
你要这样写:
字符串
至于为什么
accumulate
和类似的算法将努力成为|
-able。考虑到我们希望algo(rng, x)
和rng | algo(x)
表示相同的东西。进一步,考虑“总呼叫”algo(rng, x)
可以被完全约束(因为你有所有的信息)而“部分调用”algo(x)
基本上在所有情况下都是完全不受约束的,但很少有情况.问题是,当第二个参数
x
也可以是一个范围时,我们必然会遇到歧义。如何区分意图是全调用还是部分调用?下面是一个使用
string
的例子:型
这是一个完全调用,它使用了默认的二元运算符
+
-这是字符串连接。它所做的是遍历char
s范围内的元素,并将它们一个接一个地添加到初始空字符串中。这是一种低效但正确的复制string
的方法。最终得到值"hello"s
。它的等效管道版本呢?
型
右边是什么意思?
accumulate(""s)
可以被认为是一个总调用吗?是的,可以!默认的第二个参数是char()
,默认的第三个参数是plus()
,这很好,所以accumulate(""s)
的值是整数0
-使整个表达式格式错误,因为没有operator|(string, int)
。如何在
accumulate
中实现此功能?