问题标签 [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.
c++ - 如何创建具有可变数量类型参数的模板?
在我们的代码库中,我们使用std::variant<std::shared_ptr<SomeClass>, ...>
了很多。
这显然需要大量的写作。如何制作模板?
上面的代码片段应该T
放在哪里?期望的行为应该是:
c++ - 将参数打包的 arg 列表传递给队列
我需要做的是有一个函数,它使用参数包运算符接收任意参数列表,并将整个列表放入队列中,稍后我可以将这些参数传递给另一个函数。
这种事情:
我将如何声明这个队列,一般我将如何执行此操作?
c++ - 将参数打包的 args 传递到 std::queue 以便稍后使用不同的函数调用
我之前问了一个类似的问题,但没有意识到这还不够具体。
所以我有这个函数,它必须接受 print 函数的所有参数,包括 ... 和 all,然后将它放入一个稍后将调用实际 print 函数的队列中。
就像是:
上下文:我正在使用一个只能每 50 毫秒处理一次请求的硬件,否则它们会被忽略。我的目标是创建一个包装器,如果我一次发送一堆,它会自动添加延迟。
如果我不能这样做,我的后备方案,虽然我宁愿这样做只是 sprintf(或 C++ 等价物)到一个字符串中,只将字符串存储在队列中并在print()
没有所有参数的情况下调用。
c++ - 试图要求多个可变参数类型成为特定类型
这目前是伪代码,因为这是我在开始将其编写为完整代码之前正在研究的一个想法。
我知道我可以创建一个普通的可变参数函数,它使用va_arg
and va_list
,printf()
但是,我想完全避免使用它们。
我正在考虑使用模板化可变参数。我正在考虑使用可变参数制作一个可实例化的类模板。这里的条件是这个类的构造函数只能接受两种类型,但任何一种类型的数量都可以变化。我知道与编译器将如何解释以及调用它们的顺序相比,参数在代码中的写入位置是不可知的,但这不是问题。我为参数选择的顺序是出于可读性和一致性目的的约定。
下面是一个伪代码示例:
由于我仍在使用 C++17 并且还没有包含概念、模块和协程的 C++20,因此确保它T1
是一个类TypeIn
和T2
是一个TypeOut
类的最干净、最可靠和最有效的方法是什么对象并相应地填充数组?我可以使用向量,但是一旦构造了对象,输入和输出的大小就不会改变。
可能的用例是:
如果可能的话,我不希望有这个语法:
因为第一个更干净或更易读。
编辑
在做了一些思考之后,我想知道这是否可以代替......
但是,这将迫使用户必须构造对象,然后调用这两个函数......我试图在构造时完成所有这些......
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 扩展为空列表并且匹配失败。
c++ - Black Magic 使用 Initializer_list 和包扩展
为了扩展灵活的函数参数,有一种方法使用std::initializer_list
. 然而我无法理解。任何人都可以以一种可以理解的方式解释这一点吗?
c++ - 参数包扩展中的评估顺序问题
我写了一个模板,它接受一个istream&
和一个函数,应该从 中提取这个函数的所有参数,istream
用这些参数调用函数并返回结果。一切正常,除了函数参数的评估顺序。请参阅下面的代码、更多详细信息和最后一个问题:
输入:
预期输出:
实际输出:
我知道函数参数的评估是特定于实现的,显然这里最后一个参数首先被评估并读取第一个输入。
如何修复此代码并强制对参数进行特定的评估顺序?也许在调用函数之前单独评估它们?在不违反标准和/或依赖特定实现或编译器的情况下是否有可能?
c++ - 如何在 C++ 包扩展中包含多行或语句?
假设我有一些像下面这样的简单代码,它只打印一个元组中的所有值并跟踪当前迭代。
例如,如果我想仅在索引大于 2 时打印元组值,我该怎么做?我不能简单地if
在因为语句之前放一个cout
不允许([cquery] expected expression
在 repl.it 上)。
更一般地说,我怎样才能在包扩展中执行多行代码或语句之类的事情?
在内部使用 lambda 可以工作,例如
但我无法想象这是最有效(或预期)的解决方案。
c++ - 函数模板参数包上的模式如何工作?
您好,我有这个关于可变参数函数模板和模式的示例:
输出:
我不知道为什么我会得到这个输出,为什么不应该
-1, -2, -3 -4
呢?有人可以向我解释将模式应用于函数参数包时究竟会发生什么:
f(neg(args)...;
?太感谢了!在我看来,它以相反的顺序开始模式,我的意思是从头到尾。不是吗?
c++ - 访问多维 std::array 的可变参数扩展
假设以下 multi_array 结构:
在哪里:
我现在正在尝试实现 .at() 函数:
折叠表达式在这种情况下不起作用,因此需要递归解决方案。
我认为这是方法,但似乎无法提出正确的答案: