问题标签 [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 回答
60 浏览

c++ - 使用 SFINAE 确保可变参数包参数派生为特定类型

我目前有一个具有以下结构的类层次结构:

我可以按如下方式使用它们:

如您所见,::addItem()调用中有很多冗余。我想做的是像这样使用它们:

所以我正在考虑在我的抽象基类中的函数上使用带有 SFINAE 的可变参数函数模板::addItem()......要求如下:

  • 我将传入对象的地址(该函数接受一个指向对象的指针),因为基类存储了一个shared_ptr<Base>对象列表。
  • 我需要确保带有可变参数函数模板参数包的每个参数都是Base.

这是我到目前为止所尝试的:

我正在尝试将我的普通成员函数转换为如上所述的行为,因为我正在考虑同时使用 Varidiac 函数模板和 SFINAE 来确保参数包的每个参数至少来自Base.

我不确定正确的语法是什么,也不确定要使用的库函数集...我尝试过使用is_same, is_base_of,conjunction和其他 std 函数模板...另一个问题是如何正确扩展参数包在 if 语句中。是否有特定的符号...或者我必须使用折叠表达式?

0 投票
1 回答
695 浏览

c++ - 在两个元组上使用带有 std::apply 的折叠表达式

我刚开始学习 C++17 折叠表达式。我知道可以将折叠表达式应用于元组,如下例所示(受对此问题的回复启发):

输出:

是否可以使用类似的方法将两个元组压缩在一起?参考上面的例子,我想用另一个元组替换常量 3,比如这个假设的 std::apply 版本:

如果折叠表达式不适用于此目的,是否有替代方法可以在 C++20 中实现相同的结果(模板递归和/oriSFINAE 除外)?

0 投票
0 回答
90 浏览

c++ - 使用折叠表达式的 C++17 树遍历

我正在查看与THIS POST相同的树遍历示例。我的 VS 不支持 C++17 来查看折叠表达式的内部工作原理。我猜这一行:

只会从根遍历二叉树到第一个叶节点并返回吗?还是完整的前序遍历?
如何使用折叠表达式实现前后遍历和中序遍历?

0 投票
1 回答
69 浏览

c++ - 可变模板函数右值参数默默地将 C++ 移动到函数中

以下代码编译并打印:move move. 我宁愿它没有编译,因为它需要右值引用并且merge我不会移动它。t1t2

我不确定这里发生了什么以及为什么。此外,我认为这种行为是危险的:我在对 的调用中没有移动,merge但被移动了。t1t2

为什么这是允许的,我怎样才能merge只使用右值引用?

0 投票
1 回答
169 浏览

c++ - 初始化列表、参数包扩展、折叠表达式和求值顺序

我有以下代码来处理 n 维张量类(偏移量是 std::size_t 的 std::vector):

这可行,但我有一些问题,因为我通过拼凑我在网上找到的大量信息编写了这段代码。

  1. 第一个是第 5 行发生的事情以及它的正确名称。如果我没记错的话,这应该解压表达式并创建一个支撑初始化列表 [*]。这个列表的每个元素本身就是一个逗号分隔的列表,格式为 (exp,0)[**]。因此展开应该是 {(exp1,0),...(expn,0)}。我对吗?

  2. 第二个是关于评估顺序。[**] 应该只用于为 inizialier_list 的构造函数提供返回值而不用于其他目的(即使 index 本身可能是返回值?)。[*] 相反,给出了表达式求值的顺序。我在打印函数的示例中找到了它:

以便在参数上按顺序调用 print。这对于组合表达式也是如此吗?:

因此,如果“计算”依赖于状态,则会根据导致始终相同结果的参数顺序进行更新(独立于编译器 ecc ...)。在张量示例中,这指的是 ++i。

  1. 最后一个问题涉及到this,其中以对张量所做的方式使用 += 称为折叠表达式。我认为情况并非如此。我错了吗?
0 投票
1 回答
100 浏览

c++ - 折叠表达式的操作数是否需要加括号?

对于以下程序

gcc 打印1000,但 clang 给出错误:

我不确定我是否理解错误。像这样添加括号:

似乎仍然是一种表达,但现在 clang 也接受了这一点,并且还打印了1000.

另外,auto参数为f无关紧要,用c++17编写的等效程序具有相同的行为(如演示所示)。

那么这个程序有效吗?

0 投票
1 回答
563 浏览

c++ - 如何使用折叠表达式来实例化可变参数模板函数中的每种类型?

我正在尝试创建一个“对象管理器”,它将创建和存储模板类的实例。该类采用一个模板参数并从基类继承,以允许将具有不同模板参数的实例存储在同一容器中。将用作模板参数的类型将由用户在可变参数模板函数中提供。

以下是说明该问题的最小示例:

假设T我们将使用的每个都有一个默认构造函数。有没有办法使用折叠表达式为每个类型创建一个B<T>with并将结果指针添加到向量 in ?newTypesgenerate_a_vec()

0 投票
1 回答
66 浏览

c++ - 从一组特征创建模板包

是否有可能(如果有,如何)从索引的类型特征集生成模板包,以便它们可用于实例化变体或元组?

或者是否有必要使用变体作为输入:

甚至滚动你自己的variant,它接受一组特征而不是简单的类型列表:

0 投票
1 回答
97 浏览

c++ - 有条件地删除折叠表达式中的函数调用

我知道我可以使用 SFINAE 根据条件禁用模板化函数的生成,但这在这种情况下实际上不起作用。我想在编译时初始化一个数组,该数组应包含与条件匹配的值。像这样的东西:

我知道上面的代码是错误的,不能编译。如果没有满足条件,那么我希望折叠表达式不生成该函数调用。我该怎么做?


这个问题可能是一个 XY 问题,所以这里有一个更详细的问题。

我有一个Registry包含Group异构数据的。我希望能够查询包含指定子类型列表的所有组。例如,for (const auto& view : registry.get<char, short, int>())应该产生一个数组,其中包含包含 和 的组charshort视图int。我在下面创建了一个mcve。当前代码的问题是我必须首先创建数组然后复制视图,我想避免这种情况。


尝试评论中的建议,以下代码是我所得到的。

感觉它应该可以工作,但由于以下错误而无法编译:

0 投票
1 回答
38 浏览

c++ - 折叠表达式中的 lambda 中的非默认可构造参数

我正在尝试查看是否可以使用在 lambda 中不可默认构造的参数作为折叠表达式的一部分。T如果默认可构造,则以下代码有效。

输出