问题标签 [parameter-pack]

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 投票
3 回答
2065 浏览

c++ - 遍历 std::initializer_list

是否有可能在编译时通过std::initializer_list<int>我如何迭代递归来得出这个总和。

0 投票
1 回答
73 浏览

c++ - 我可以将参数类型分支到 C++17 中的参数包吗?

当前(旧)函数调用签名:

现在,由于我只能使用(地址大小的)整数调用来宾,这是一个非常有限的接口,我想将其扩展为至少也处理浮点值,可能还有其他值,如下所示:

那将是新的函数签名,取代旧的。

要显示当前如何使用 args 向量:

这个函数是用 std::move(args) 从 vmc​​all 调用的,它所做的只是将 args 向量中的整数参数以增量方式复制到整数 CPU 寄存器中。当我想调用一个只接受整数参数的函数时,这很好用。所以,如果我想调用一个函数,比如说,它接受一个浮点参数,那么就没有办法做到这一点。这是因为 FP 寄存器是完全独立的,需要区别对待。

此外,32 位和 64 位浮点数通过 NaN 装箱以不同方式处理。所以,如果能区分 float 和 double 就好了。

一开始我对模板魔法的能力并不强。如何对参数包中每个元素的类型进行分支?

0 投票
1 回答
38 浏览

c++11 - 在不使用折叠表达式(C++11)的情况下以正确顺序处理模板参数包的值的最简单方法是什么

我想将以下代码反向移植到 C++11:

对参数包 I 的每个值调用“bar”的顺序很重要——我相信这在上面的 C++17 实现中有效,因为折叠表达式使用逗号运算符。

我最初选择了一个明确的递归实现:

这似乎可行,但需要 g() 的两个实现。在尝试使用单个函数时,我读到包扩展将在 make_tuple 中发生,并认为这会起作用:

不幸的是,这不会为执行顺序提供任何保证——事实上,对于 gcc,执行顺序正好相反。或者,我可以使用一个花括号初始化列表:

这似乎保留了 gcc 的顺序,但我无法弄清楚这是否只是巧合。

所以,具体的问题是:

  • h2的执行会保证正确的执行顺序吗?
  • 有没有我错过的替代实现?
0 投票
1 回答
76 浏览

c++ - C++ 迭代模板参数

可以根据参数列表和使用 C++17 折叠的一些逻辑填充虚拟机的适当寄存器,如下所示: https ://github.com/fwsGonzo/libriscv/blob/master/lib/libriscv/ machine_vmcall.hpp#L35

https://github.com/fwsGonzo/libriscv/blob/master/lib/libriscv/machine_vmcall.hpp#L18

结构将被压入堆栈,地址将占用一个整数寄存器槽。因此,我可以将常规函数调用转换为对我的虚拟机的调用。我认为任何其他编程语言都无法做到这一点。

现在,相反,有系统调用处理程序。它们看起来像这样: https ://github.com/fwsGonzo/libriscv/blob/master/emulator/src/syscalls.cpp#L20

为了简化系统调用处理,我希望能够获取参数类型列表,对它们中的每一个执行一些逻辑(根据类型提取值),然后可以选择使用我建立的参数调用 lambda。

参数的数量和类型是预先知道的。在从机器寄存器中提取这些值之前,这些值是未知的。

感谢@bipll 的回答。我选择这样实现它:

0 投票
1 回答
53 浏览

c++ - 参数包扩展未在 C++ 中编译

在 C++ 中,当我尝试扩展参数包时,它给了我错误

“参数包没有用'...'扩展”和“错误:预期的';' 在 '...' 标记之前"

帮助将不胜感激。我使用 mingw 8.2.0。

代码:

0 投票
1 回答
40 浏览

c++14 - 递归解压缩模板包的无参数函数

我正在尝试使用可变参数模板类型包创建一个结构模板,它可以扣除传入的所有类型的大小之和。

下面是一个简化的示例,在实际环境中,计算的大小用于创建更多的成员对象。

当涉及到参数列表时,我已经习惯了这种递归参数解包方法,并假设这适用于无参数函数和显式模板规范。但是使用 clang 编译时出现以下错误

所以似乎最后一次递归迭代在这里不起作用——不知道为什么编译器不简单地选择最明显的选择:只有一种模板类型的那个——就像如果有一个实际的模板参数就会发生一样传递给函数。

那么,我该怎么做才能使这个编译和工作按需要呢?

0 投票
3 回答
312 浏览

c++ - 有没有办法在不使用递归的情况下获取参数包中的值?

我见过许多使用递归从参数包中提取值的示例代码。除了递归之外,还有什么方法可以从参数包中提取值?

0 投票
0 回答
103 浏览

c++ - 使用模板参数包初始化联合

我正在用 ECS 和面向数据的模型编写引擎。我试图避免继承和动态调度,以避免每次update()调用都破坏缓存。我想出的是:

然后我有一个room通过内存池保存所有系统和组件的类(管理器)。问题是

编译器抱怨的部分:

我尝试移动椭圆,但没有效果。我实际上想要做的是避免在每一帧上同时使用模板和动态调度,但我需要模板进行初始化。我有一些基本语法错误吗?我完全错过了什么吗?我是面向数据的范式的新手,所以我很乐意接受任何建议。最小的可重现示例:https ://godbolt.org/z/zGAfXS

0 投票
1 回答
48 浏览

c++ - 如何以“解压缩”的方式扩展参数包模式?

假设我有一个可变参数函数foo

我想要一个神奇的函数,它以下列方式bar将它的参数转发给:foo

说如果我打电话

它的效果与

如何实施bar()

0 投票
1 回答
112 浏览

c++ - 将具有不同类型的模板参数包提取到双精度向量中会产生警告

我正在尝试将大量基本相同但采用不同数量参数的类转换为单个模板类。所以我创建了一个模板类示例(不是真正的代码 - 仅作为示例):

我这样运行:

此处包含警告的完整示例以及模板类替换的先前许多类的示例:https ://rextester.com/RBEA68379

所以我理解错误/警告消息(基本上,如果我转换,我可能会丢失数据)。但我想抑制警告 - 也许通过强制转换。但是我不知道如何使用参数包来做到这一点 - 也许我错过了它,但我没有在网上找到它。

我猜有两个问题:

  1. 我可以将其投射(或其他不会关闭警告的方法)吗?
  2. 我只是想将参数包提取到我可以迭代的结构中,我在做什么是明智的,还是有更好的方法?