问题标签 [pack-expansion]

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 回答
250 浏览

c++ - 如何创建具有可变数量类型参数的模板?

在我们的代码库中,我们使用std::variant<std::shared_ptr<SomeClass>, ...>了很多。

这显然需要大量的写作。如何制作模板?

上面的代码片段应该T放在哪里?期望的行为应该是:

0 投票
0 回答
34 浏览

c++ - 将参数打包的 arg 列表传递给队列

我需要做的是有一个函数,它使用参数包运算符接收任意参数列表,并将整个列表放入队列中,稍后我可以将这些参数传递给另一个函数。

这种事情:

我将如何声明这个队列,一般我将如何执行此操作?

0 投票
1 回答
110 浏览

c++ - 将参数打包的 args 传递到 std::queue 以便稍后使用不同的函数调用

我之前问了一个类似的问题,但没有意识到这还不够具体。

所以我有这个函数,它必须接受 print 函数的所有参数,包括 ... 和 all,然后将它放入一个稍后将调用实际 print 函数的队列中。

就像是:

上下文:我正在使用一个只能每 50 毫秒处理一次请求的硬件,否则它们会被忽略。我的目标是创建一个包装器,如果我一次发送一堆,它会自动添加延迟。

如果我不能这样做,我的后备方案,虽然我宁愿这样做只是 sprintf(或 C++ 等价物)到一个字符串中,只将字符串存储在队列中并在print()没有所有参数的情况下调用。

0 投票
3 回答
90 浏览

c++ - 试图要求多个可变参数类型成为特定类型

这目前是伪代码,因为这是我在开始将其编写为完整代码之前正在研究的一个想法。

我知道我可以创建一个普通的可变参数函数,它使用va_argand va_listprintf()但是,我想完全避免使用它们。

我正在考虑使用模板化可变参数。我正在考虑使用可变参数制作一个可实例化的类模板。这里的条件是这个类的构造函数只能接受两种类型,但任何一种类型的数量都可以变化。我知道与编译器将如何解释以及调用它们的顺序相比,参数在代码中的写入位置是不可知的,但这不是问题。我为参数选择的顺序是出于可读性和一致性目的的约定。

下面是一个伪代码示例:

由于我仍在使用 C++17 并且还没有包含概念、模块和协程的 C++20,因此确保它T1是一个类TypeInT2是一个TypeOut类的最干净、最可靠和最有效的方法是什么对象并相应地填充数组?我可以使用向量,但是一旦构造了对象,输入和输出的大小就不会改变。

可能的用例是:

如果可能的话,我不希望有这个语法:

因为第一个更干净或更易读。



编辑

在做了一些思考之后,我想知道这是否可以代替......

但是,这将迫使用户必须构造对象,然后调用这两个函数......我试图在构造时完成所有这些......

0 投票
1 回答
48 浏览

c++ - 如何泛化可变参数函数 fn到 fn

假设有可变参数函数template<typename... Args> foo(const S& s, Args... args)

有没有办法编写bar(const S& s0, Args0...args0, const S& s1, Args1...args1, ..., const S& sN, ArgsN...argsN)扩展为的函数foo(s0, args0...); foo(s1, args1...); ...; foo(sN, argsN...);

我试过(没有成功):

如果我理解正确编译器(clang 9.0.0)总是将 Args0 扩展为空列表并且匹配失败。

0 投票
1 回答
135 浏览

c++ - Black Magic 使用 Initializer_list 和包扩展

为了扩展灵活的函数参数,有一种方法使用std::initializer_list. 然而我无法理解。任何人都可以以一种可以理解的方式解释这一点吗?

0 投票
1 回答
564 浏览

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

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

输入:

预期输出:

实际输出:

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

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

0 投票
1 回答
311 浏览

c++ - 如何在 C++ 包扩展中包含多行或语句?

假设我有一些像下面这样的简单代码,它只打印一个元组中的所有值并跟踪当前迭代。

例如,如果我想仅在索引大于 2 时打印元组值,我该怎么做?我不能简单地if在因为语句之前放一个cout不允许([cquery] expected expression在 repl.it 上)。

更一般地说,我怎样才能在包扩展中执行多行代码或语句之类的事情?

在内部使用 lambda 可以工作,例如

但我无法想象这是最有效(或预期)的解决方案。

0 投票
0 回答
26 浏览

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

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

输出:

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

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

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

0 投票
2 回答
42 浏览

c++ - 访问多维 std::array 的可变参数扩展

假设以下 multi_array 结构:

在哪里:

我现在正在尝试实现 .at() 函数:

折叠表达式在这种情况下不起作用,因此需要递归解决方案。

我认为这是方法,但似乎无法提出正确的答案: