问题标签 [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 投票
0 回答
38 浏览

c++ - 参数包的类型和积分的关键字

如果我有一个检测专业化的特征(即模板类型):

这按预期工作:

除非参数包类型之一实际上是一个值:

这是因为template <typename...> class U声明是专门针对types的,如果我将其切换到template <auto...> class U它将接受所有值 - 但是有没有一种方法可以声明它可以混合使用类型值?

0 投票
0 回答
93 浏览

c++ - 使用模板参数包扩展枚举

是创建枚举扩展行为的说明。我已经这样实现了:

继承num.h

然后在main.cpp

我可以扩展行为以继承另一种这样的类型

继承编号.h

然后在main.cpp

问题是如何在这里使用参数包,而不是手动添加新类型:

0 投票
1 回答
104 浏览

c++ - 如何在标准函数 lambda c++ 11 中正确捕获参数包

我一直在尝试在 std 函数 lambda 中捕获一些参数包参数,以便将函数保存在内存中以供将来使用。

但是,在某些情况下,如果这些捕获参数中的任何值在捕获后被修改,则这些参数的未来使用不是预期的。

我想在我的 std 函数中存储参数包的不可变副本。

此代码将作为库实现,因此用户可以使用它来保存一些文本以供将来打印。这样我们就无法管理我们在参数包中收到的参数。此示例必须对字符串有效,const char *, int, float, ...

这是一个示例代码:代码链接

这个例子的输出是:

它应该是:

有没有更好的方法将收到的文本和参数包保存在内存中以备将来使用?而不是使用存储在向量中的 std 函数。

0 投票
1 回答
63 浏览

c++ - 处理参数包时何时需要省略号?

我试图从 cppreference.com 理解一些代码。相关部分在这里

如果我正确解释上述内容,((os << tupleArgs << (++n != sizeof...(Ts) ? ", " : "")), ...)则为逗号运算符上的折叠表达式。从语义上讲,它是([some pattern involving the parameter pack's values] , ...)用逗号折叠的意思。

然而我不明白的是为什么sizeof里面有一个sizeof...?对我来说,省略号意味着扩展,但我们不想在那里扩展。Ts就像一个聚合类型,类似于元组,我们只需要在编译器评估折叠时该聚合类型的大小。事实上,在 Visual Studio 中,无论有没有省略号,它都可以工作。在 GCC 中也是如此,Godbolt 告诉我。(编辑:实际上我错了,没有它编译的省略号,但输出包含一个不应该存在的尾随逗号)

sizeof...如果您想要参数包的大小,是否总是使用该规则?

0 投票
0 回答
27 浏览

c++ - 在c ++中访问参数包中的参数

如何访问参数包中的每个参数?

我的主要可执行文件中有一个函数声明,但函数体在其他库中

我对每个库都有foo one 的多个实现,每次我都知道我期望什么类型的数据。问题是,当使用一个库时,我有例如 2 个参数 - int、float,而第二个库需要 int、string、vector。

问题是:如果我知道有多少个参数以及这些参数的类型是什么,如何访问这些数据?

我知道我可以通过许多不同的方式实现这个用例(我可能会将参数移动到每个类的 init 函数),但现在我只是好奇如何使这个工作。假设我无法更改some_class的初始化程序。

0 投票
2 回答
65 浏览

c++ - 参数包提取

我有一个函数 2,可以使用或不使用第二个参数 == char 来调用它。如果是这样,我想修改那个字符参数。

给定

这有效:

简单地放在括号中,已经不起作用了:

这会导致以下错误:

实际上在这里我想修改参数,但我当然得到相同的

0 投票
0 回答
26 浏览

c++ - 函数模板参数包上的模式如何工作?

您好,我有这个关于可变参数函数模板和模式的示例:

输出:

  • 我不知道为什么我会得到这个输出,为什么不应该-1, -2, -3 -4呢?

  • 有人可以向我解释将模式应用于函数参数包时究竟会发生什么:f(neg(args)...;?太感谢了!

  • 在我看来,它以相反的顺序开始模式,我的意思是从头到尾。不是吗?

0 投票
1 回答
41 浏览

c++ - 有没有办法在 C++ 的参数包中扩展可变参数模板参数的范围类型?

我想强制参数包中的所有类型都在其中声明一个嵌套类型别名(T),并将所有T类型的 's 扩展为tuple. 这样的事情可能吗?当我尝试下面的幼稚方式时,它不会被识别Types::T为一种类型。

0 投票
1 回答
58 浏览

c++ - `class function<_Res(_ArgTypes...)>` 是什么意思?

gcc 中的代码std::function有这两行:

第一部分template... _ArgTypes表示“参数包”,即模板参数的可变数量;这很清楚。但第二行很神奇。好的,写作class function<SmthHere>意味着模板专业化,所以我们function_Res(_ArgTypes...). 后者看起来像一个带有可变数量参数的函数调用。但是如果_Resisvoid_ArgTypesis int,我们得到void(int): 这对我来说没有意义,因为我们不能有一个命名的函数并向它void传递一个参数int(??)。这是特别支持的语法吗?你能澄清一下吗?

0 投票
1 回答
50 浏览

c++ - 扩展包含 lambda 类型的参数包时出现奇怪的错误

我有一个函数,foo如下例所示:

现在我想用一些 lambdas 调用这个函数,例如:

不幸的是,这不起作用,因为我收到以下错误:

AFAIK,也就是说,因为 lambdas 不能被隐式转换为std::functions那样。

解决此问题的一种方法是std::function像这样手动包装 lambda:

但是对于多个 lambda,这将变得非常乏味。

为了解决这个问题,我尝试创建一个包装函数,该函数检测使用辅助类型传递的 lambda 的参数类型,然后将 lambda 包装为正确的std::function类型。这是仅用于单个参数(即不是可变参数)的包装函数:

辅助类型FunctionTypeTraits是这样实现的:

现在我可以用我的 lambda 调用包装函数,编译器非常高兴:

原则上,我现在应该能够fooWrapper像这样制作可变参数:

然而,这不起作用。如果我用完全相同的代码调用这个新函数,我会收到以下错误:

我不太明白这个错误。为什么相同的方法适用于单个模板类型,但不适用于扩展的参数包?这可能只是一个编译器错误吗?
还有另一种方法,我可以实现foo使用 lambdas 调用的目标,而无需手动将它们中的每一个包装在std::function?