问题标签 [fold-expression]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
115 浏览

c++ - Can this code that expands integer parameter pack be written with just 1 function?

I have code that uses fold expressions to compare function argument against integer parmeters of class template. Code works AFAIK, but I wonder if it is possible to do what I want without _impl helper function.

Full code(my question is if contains can be implemented without contains_impl):

Note 1: I know this code has many issues, I do not plan to use it in production and I discourage people from using it directly or as inspiration, this is a toy example I wanted to implement after reading interesting article about frozen C++ library.

Note 2: false || looks ugly, but IDK any nicer way.

0 投票
1 回答
891 浏览

c++ - 折叠表达式的求值顺序

折叠表达式似乎是将函数应用于元组的每个元素的好方法。但是,如果应用的函数有副作用,函数调用的顺序可能是一个重要的问题。

考虑:

似乎行得通

但是这里是否保证了 lambdas 的评估顺序,或者我最终可以在输出中翻转这些值?如果我使用不同的运算符将命令链接在一起,答案会改变吗?

0 投票
9 回答
4264 浏览

c++ - 我可以使用折叠表达式实现 max(A, max(B, max(C, D))) 吗?

在尝试使用 C++17 折叠表达式时,我尝试实现 max sizeof,其中结果是sizeof类型的最大值。我有一个使用变量和 lambda 的丑陋折叠版本,但我想不出一种使用折叠表达式并std::max()获得相同结果的方法。

这是我的折叠版本:

我想使用折叠表达式和std::max(). 例如对于 3 个元素,它应该扩展为

有可能这样做吗?

0 投票
3 回答
1080 浏览

c++ - 从“级联 ifs”折叠表达式中检索值

假设我想使用以下语法创建自己的基于lambda的开关:

我想使用折叠表达式来获得不需要递归的简洁实现。这个想法是生成类似于一堆嵌套if语句的东西:

我想写这个:

上面的代码不起作用,因为if(...){...}它不是表达式。然后我尝试使用&&运算符:

这确实编译,但返回的结果ps.first == x && ps.second()是 abool而不是int我想要的值。

我想要某种运算符,它是逗号运算符和之间的组合:如果左侧计算&&为 ,它应该计算并计算到运算符的右侧true

我想不出任何技术可以让我以这样的方式实现它,我可以获得ps.second()的返回值并将其传播给 . 返回的 lambda 的调用者make_switch

是否可以使用折叠表达式实现这种“级联ifs”模式?在找到匹配的分支之前,我只想评估所需数量的表达式。

0 投票
3 回答
4282 浏览

c++ - 用 C++17 fold-expression 测试所有元素是否相等

我有一个采用可变参数包的函数,一开始我想检查所有元素是否比较相等。我可以以某种方式使用新的 C++17 折叠表达式将其简洁地写成单行吗?我刚在想

但这不起作用,因为它编译为首先正确比较最后两个参数的代码,然后将倒数第三个参数与第一个比较的结果进行比较,这是一个布尔值。这种类型的折叠表达式可能有什么用例(类似于args < ...)?我有没有机会避免编写专用的递归模板来做到这一点?

0 投票
2 回答
1022 浏览

c++ - 由单个元素组成的参数包的基本折叠表达式转换为无括号表达式

考虑一个例子:

[现场演示]

decltype(auto)从带括号的左值推导应根据[cl.type.simple]/4.4推导为左值引用。例如:

但是被剪断的会触发 static_assert。即使我们将表达式组合成额外的括号,例如:

它不会改变效果。

标准中是否有一点可以防止将单个元素的折叠表达式扣除到左值引用中?


编辑

作为Johannes Schaub 的一个重要观点 - litb clang 实际上确实将代码的双括号版本解释为带括号的左值并推断出左值引用。在这种情况下,我会将其解释为 gcc 错误。然而,带有单括号版本的版本仍然存在问题。令我困惑的是,至少在一个以上元素的情况下,版本必须转换为带括号的代码 - 以满足运算符优先级。例如:

不一致的原因是什么?

0 投票
2 回答
1124 浏览

c++ - 使用折叠表达式检查可变参数模板参数是否唯一

inline constexpr bool给定一个可变参数模板参数包,我想使用 an和fold 表达式检查给它的所有类型是否都是唯一的。我尝试这样的事情:

在哪里is_one_of可以正常工作的类似布尔值。但是无论我在 is_one_of 中输入了什么,这条线都不会编译。这甚至可以使用折叠表达式来完成,还是我需要为此目的使用常规结构?

0 投票
2 回答
65 浏览

c++ - 折叠表达式:右移初始化行为

我对折叠表达式很感兴趣,以便更好地理解在我的项目中可以在哪里使用它们。所以我选择用一个简单的初始化它们

到目前为止,一切都按预期工作,每个值都为 1。然后我尝试使用左移初始化,所以:

这也是我期望的工作,它增加了 2 的幂,这很好。最后我尝试了这个:

它给了我一个输出0, 1, 0, 1, 0, 1, ...,我预计它会全部为 0。所以这里的代码:

为什么它是0, 1, 0, 1etc 而不是0, 0, 0, 0?我通过每个参数它会做更多类似的事情: arg1 >>= arg2, arg2 >>= arg3, arg3 >>= arg4, etc 但确实最后一个值应该是 1 那么它也可能是0, 0, 0, 1.

0 投票
2 回答
1642 浏览

c++ - C++17 模板类初始化的折叠表达式的限制类型

我基本上尝试编写自己的游戏引擎供练习和个人使用(我知道,这几乎是一项不可能完成的任务,但正如我所说,它主要用于学习新事物)。

目前,我正在研究我的数学库(主要是向量和矩阵),我遇到了一个有趣但主要是美学问题。

给出以下伪代码:

现在我希望能够以所需的浮点数作为参数来构造结构:

由于数组的大小是由模板参数给出的,所以我很难为结构声明一个合适的构造函数。我的最终目标是这样的:

当然,这是非逻辑语法,但我以这种方式实现的最接近的事情是使用C++17 折叠表达式

它在填充数组的意义上工作得非常好,而且(我猜)开销不大,但对于使用这个结构的程序员来说,它也容易出错,因为它没有直接指示构造函数接受了多少参数。

此外,它没有指定应该是哪种类型的参数,这是我最大的问题。

如果它有效,为什么会有问题?

想象一下使用 TVector 结构的以下结构:

鉴于构造函数类似于向量结构的折叠表达式,我希望能够使用相应大小的向量或大括号初始化来构造矩阵。

  1. 聚合初始化不起作用。

    /li>
  2. 当给定错误的参数(例如大小错误的向量,不适合作为矩阵的列)时,它在编译之前不会显示错误。

  3. 错误的来源并不总是很清楚。

TL; DR:现在终于到了我真正的问题:

有没有办法限制折叠表达式的类型,最终根本不使用模板并解决我上面给出的 3 个问题?

我想像:

和:

当然,我在这里很挑剔,这主要是一个审美问题,但我认为这是一个重要的设计决策,它可以真正提高代码的可用性。


感谢您阅读本文并帮助我解决我的第一个问题 :)

0 投票
1 回答
2716 浏览

c++ - 在 C++17 中解包可变参数元组

c++17(可能是 C++2a)有什么比经典的 C++14 解包可变参数元组更好的方法std::index_sequence吗?

有什么比这更好的:

折叠表达式结构化绑定?有什么提示吗?我可以接受为什么我不能在这里使用这些提到的 C++17 功能的答案——但我更喜欢“解决方案。