15

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

template<typename ... T>
int sum(T...t)
{
    return (... + t);
}

该文档进一步指出,我可以使用 == 或 > 等运算符来代替 +。任何人都可以想出一个明智的例子,说明我什么时候想在这样的构造中使用 == 或 >?

(我意识到人们可以定义 == 和 > 来对奇怪的类做奇怪的事情,但这肯定违反了良好的做法。写作a > b > c > d从来都不是一个好主意,是吗?)

4

3 回答 3

11

如果像在 Python 中那样处理的链式比较a < b < c被解释为a < b and b < cb. 不幸的是,在 C++ 中情况并非如此,即使在奇怪的情况下,折叠比较运算符确实几乎没有意义。

请注意,有一个提议(P0313) 从折叠表达式处理的运算符中实际删除运算符==, !=, <,>和。2016 年 6 月在奥卢召开的委员会会议上对此进行了讨论。删除的动机相当简短:<=>=

比较运算符在折叠表达式中没有多大意义;它们扩展到具有惊人效果的表达式,因此仅对 dsl 元程序员有用。[...] 能够修复诸如a < b < c. 那将需要一台时间机器。不重复折叠表达式的问题似乎是可行的。

也就是说,该提议被拒绝了。

于 2016-05-21T12:53:47.363 回答
2

这不是“单独的 == 的直接折叠”,而是“&& 与涉及 == 的表达式折叠。然而,这是我用来比较值的解决方案,也许这也是您想到的那种应用程序。

这对我有用,对于 g++ 和 clang++

template <typename TYPE, typename... TYPE_TAIL>
constexpr bool same_value([[maybe_unused]] TYPE value, TYPE_TAIL... value_tail)
{
  return (... && (value == value_tail));
}

static_assert(same_value(3));
static_assert(same_value(3, 3));
static_assert(!same_value(3, 1));
static_assert(same_value(3, 3, 3));
static_assert(!same_value(3, 1, 3));

int main() {}

汇编:

clang++ -std=c++1z testFold.cpp -o testFold

(版本:clang 版本 5.0.0-+rc2-1 (tags/RELEASE_500/rc2))

或者

g++ -std=c++17 testFold.cpp -o testFold

(版本:g++(Debian 7.2.0-8)7.2.0)

[[maybe_unused]]防止编译器在仅使用一个参数调用时发出警告,因为same_value(one_arg)在这种情况下,函数返回 && 运算符的中性值(即true)。

于 2017-10-19T14:50:50.000 回答
1

在用例上是表达式模板,比较运算符(例如operator ==)返回一个类对象而不是一个bool.

不过,即使在这里,我也很难想出一个有用的例子。

于 2017-03-30T15:17:45.210 回答