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

c++ - 从模板参数包实例化的访问类实现

我想StatesMachineTas中实例化所有,shared_ptr<T>然后通过 typename 访问它们。

在下面的代码中,它指的是实例化(MachineT 构造函数)和访问状态的方法(get 函数)。

是否有任何哈希图技巧或方法可以在类中存储“索引”信息,例如StateA::Index

0 投票
2 回答
261 浏览

c++ - 结合函数参数包和默认参数

我有一个带有参数包的函数:

(实现不重要,只是签名)。我想使用 GCC/Clang 内置函数将源位置添加为默认参数。就像是

这可以编译,但对它的调用并没有args像我希望的那样传递参数;例如

给出(在 Clang 10 上)

这似乎表明args是空的,0file"a"line

实际上,在编写问题时,我发现显式传递Targs有效:

有可能避免这种情况吗?

0 投票
1 回答
90 浏览

c++ - 在类模板中分离参数包

我正在尝试编写一个使用参数包并为参数包中包含的每种类型实现成员函数的类模板。

这是我到目前为止所拥有的:

我的目标是拥有一个可以通过以下方式使用的类模板:

类模板机制将为 a doSomething(std::string x)、 adoSomething(int x)doSomething(double x)成员函数创建实现,但不是成员doSomething(std::string x, int i, double f)函数。

我在网上找到了很多关于参数包可用性的示例,但我不知道它是否可以用于我的目的,或者我是否完全误解了参数包的用途。

我以为我需要解包参数包,但是在阅读了很多关于解包参数包的示例之后,我认为这不是正确的选择,它具有完全不同的含义。

因此,我正在寻找一种“离婚”参数包的操作。

0 投票
0 回答
96 浏览

c++ - std::thread 是否使用参数包,如果是,那么如何使用?:)

我想达到类似的结果:

std::thread接受一个函数指针和任意数量的参数。在我从 std::thread 派生的类中,我想用任意数量的参数初始化 std::thread 但我收到一条错误消息:

但是当我删除标题中的点时,我得到链接器错误。我也希望能够在没有参数的情况下运行它。

我有以下代码(-stdc++17):

线程c.hpp

主.cpp:

如果有人可以帮助我,我将非常感激。我仍然是 C++ 初学者和高中生:)

0 投票
1 回答
59 浏览

c++ - 是否有任何常规模式可以找出在模板中放置 ... 的位置?

...我对使用模板参数包时应该放置的位置感到困惑。

例如,在模板参数列表中,我们应该使用typename ...Ts,而在参数列表中,它变成Ts...ts

当实例化一个模板时tuple<Ts...>,最让我困惑std::forward<Args>(args)...的是,...括号外的。在那之前,我强迫自己只记住这一点,直到今天我看到这个:sizeof...(Params),我想我必须了解正则模式以避免进一步混淆。

那么任何人都可以帮助如何对待它...以充分了解放置它的位置吗?

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 投票
2 回答
171 浏览

c++ - 从 std::tuple 中提取类型以获得方法签名

我正在寻找一种方法来提取类型std::tuple以定义方法签名。采取以下(人为的)示例:

考虑 AAdapter 更改、添加或删除不透明参数类型的方式。基本上,我想B::doSomething()简单地重定向到B::AAdapter::doSomething(),所以我希望这两种方法都具有完全相同的签名。问题是:如何B::AAdapter::doSomething()从 inside获取参数类型B

B::doSomething()在上面的代码中的定义是我来得最远的:我正在std::tuple使用里面的参数类型进行类型定义A,所以我可以将它们解包回B. 不幸的是,通过上述方法,我仍然需要Index...在调用时手动提供模板参数B::doSomething()。当然,必须有一种方法可以Index...从元组的大小中自动推断出这些参数。我曾考虑过使用 的方法std::make_integer_sequence,但这需要我为序列本身定义一个额外的方法参数(并且它不能是具有默认值的最后一个参数,因为在参数包之后不允许使用其他参数)。

有没有什么办法可以做到这一点,不管有没有 std::tuple?需要 C++17 的解决方案会很好。

编辑1:

我现在意识到,我可以通过B 继承AAdapter不是将AAdapter对象作为成员来规避特定应用程序中的问题,但我仍然想知道如何在不必这样做的情况下解决问题。

编辑2:

也许一些关于为什么AAdapter存在以及我想要实现的附加信息。我正在围绕现有的 C API 实现一种包装类,实际上需要在另一个进程中调用,RPC 样式。因此,如果用户想在远程进程中调用 C 函数,他们将改为在本地调用我的包装类中的相应方法,该方法处理所有 RPC 内容,如类型转换、实际远程调用和其他丑陋的细节。这个包装类B在我上面的代码中表示为。现在我的包装方法签名通常不会具有与 C 函数完全相同的签名。例如,包装器可能具有而不是C 函数具有std::string_view的一对。const char*, size_t由于这里不重要的原因,它还需要有一个输出参数(一个指针),而 C 函数有时有一个返回值。

为了让我不必定义两个单独的方法签名(实际上是三个)并编写代码来转换每个单独的参数,我只将其中一个签名作为模板参数RetT, ArgsT...传递给B. 一个签名转换类(AAdapter在上面的例子中)然后应用规则如何通过添加参数、更改它们的类型等从第一个签名自动生成第二个签名。A然后将保存这个生成的签名,并B拥有我提供的签名最初。但是,我想B提供一个invoke()带有 签名的方法A,从而完全隐藏A用户的整个方法签名。这就是为什么我需要访问模板参数类型A从内部B,以及为什么我不能简单地移除中产阶级AAdapter

0 投票
0 回答
50 浏览

c++ - CTAD 和带有参数包成员的模板构造函数

尝试将通用引用与 CTAD 和参数包一起使用,我尝试了类似下面的方法,但它无法在 MinGW GCC 上编译。我不明白为什么。这是示例代码:

这些是错误:

0 投票
0 回答
149 浏览

c++ - 如何指定接受任何类型或值的参数包?

在为类型指定参数包时,我希望不仅能够接受typenames,而且能够接受任意类型的值。例子:

显然,thing不是一个有效的 C++ 关键字,但这里表达的想法是否可能?


上下文是我有一个容器适配器,它想要将自己的值类型插入到容器中,但允许传递任何其他模板参数,并且一些容器不仅接收类型参数,还接收值(std::array将是一个流行的例子)。

0 投票
1 回答
564 浏览

c++ - 参数包扩展中的评估顺序问题

我写了一个模板,它接受一个istream&和一个函数,应该从 中提取这个函数的所有参数,istream用这些参数调用函数并返回结果。一切正常,除了函数参数的评估顺序。请参阅下面的代码、更多详细信息和最后一个问题:

输入:

预期输出:

实际输出:

我知道函数参数的评估是特定于实现的,显然这里最后一个参数首先被评估并读取第一个输入。

如何修复此代码并强制对参数进行特定的评估顺序?也许在调用函数之前单独评估它们?在不违反标准和/或依赖特定实现或编译器的情况下是否有可能?