C++中的折叠表达式17 - 用于比较运算符的用例

oz1*_*1cz 14 c++ fold-expression c++17

根据N4295, C++ 17将允许我计算未知数量的参数的总和,从而:

template<typename ... T>
int sum(T...t)
{
    return (... + t);
}
Run Code Online (Sandbox Code Playgroud)

该文档进一步指出我可以使用诸如==或>之类的运算符而不是+.任何人都能想出一个合理的例子,当我想在这样的结构中使用==或>时?

(我意识到人们可以定义==和>为奇怪的课程做一些奇怪的事情,但肯定会违反良好的做法.写作a > b > c > d几乎不是一个好主意,是吗?)

Mor*_*enn 10

如果链接比较在Python中处理,我将是一个有趣的功能,其中a < b < c解释为a < b and b < c单个评估b.不幸的是,在C++中并非如此,即使在奇怪的情况下,折叠比较运算符确实没有意义.

需要注意的是有一个建议(P0313),以实际删除运营商==,!=,<,>,<=>=从折表情完全处理的运营商.2016年6月在奥卢召开的委员会会议上对此进行了讨论.删除的动机相当简短:

比较运算符在fold表达式中没有多大意义; 它们扩展为具有惊人效果的表达式,因此仅对dsl-metaprogrammers有用.[...]能够修复像这样的表达式会很好a < b < c.这需要一台时间机器.不重复折叠表达式的问题似乎是可行的.

那说提案被拒绝了.

  • 我赞成"混合折叠",你可以说"t op1 ... op2"用于一元折叠,"t op1 ... op2 e"用于二进制折叠,扩展为"t1 op1 t2 op2 t2 op1 t3 ... ". (2认同)