问题标签 [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 回答
66 浏览

c++ - Passing parameter packs to a template with parameter non-pack and parameter-pack

The following code is an error in GCC trunk and Clang trunk:

https://godbolt.org/z/YYzdeh

Why does parameter pack A split correctly into Type and More ... in C_ok but not in C_bad?

Fixed: Template parameter Type in Contain_t was redundant.

(Please ignore that it will not work when called with 0 parameters)

0 投票
1 回答
70 浏览

c++ - 对任意数量的类使用可变参数模板参数

我有一种情况,我需要一个FaceProp为实际面部类型维护/持有其他类的类。这些可以是任何类型的面,如边界面、实体面、内部面等。我想FaceProp使用 C++ 中的可变参数包功能来实现,但我不确定如何实现。

我正在尝试以下主要课程

我不确定如何声明这些将如何工作,因为在实施时我不知道我需要处理多少/以及哪些面部类型。这是通过编译时间知道的。换句话说,当我想声明这个类时,FaceProp我会知道要使用多少种面部类型

例如

如何最好地做到这一点?

0 投票
1 回答
45 浏览

c++ - 如何实现 constexpr N-way set_union(去重合并)

我有一堆结构std::array,其中包含不同数量的预先排序的size_ts。作为一个玩具示例,假设我们有以下三个结构:

目标是在编译时执行与N-way等效的操作;std::set_union例如,鉴于上述结构,我希望能够编写

并最终bounds作为constexpr std::array<size_t, 8>包含值0, 100, 125, 200, 250, 300, 301, 500

合并一对结构中的bounds数组非常容易。但是,对于如何最好地将其概括为使用可变参数模板和参数包,我有点不知所措。为了使具有对的版本工作,我首先“模拟”合并以确定合并数组在实际执行合并之前将持续多长时间,但是当与参数包结合时,这种方法会变得非常麻烦。(我怀疑即使我的配对代码也远没有我能更好地处理一些相关的语言特性时那么优雅......)

这是一个 MWE,展示了我的配对功能代码:

如何概括merge_bounds以允许将任意数量的此类结构指定为模板参数?

0 投票
1 回答
28 浏览

c++ - 如何停止这个模板化函数值初始化一个新构造的对象?

如果我可以在创建新对象时为构造函数参数提供一个参数包,并且我不提供任何构造函数参数,那么结果将是:new T(); 如果它没有用户提供的构造函数,它将对对象进行值初始化。我该如何阻止这种情况发生?

0 投票
3 回答
88 浏览

c++ - 使用 tuple_cat 将参数包扩展为元组

Godbolt 链接:https ://godbolt.org/z/18nseEn4G

我有一个 std::map 各种类型的向量(强制转换为 void*)和一个T& get<T>方法,它为我提供了对映射中一个向量中的元素的引用。

我希望能够使用结构化绑定来取回对相同索引但在不同向量中的 3 个元素的引用,但我不确定如何创建一个对T& get<T>方法进行多次调用的元组。像这样的东西;

我目前正在尝试对T& get<T>参数包中的每个参数进行重复调用,但我无法找出正确的语法。

我怎样才能使这项工作?这是我当前尝试的链接: https ://godbolt.org/z/18nseEn4G

或者,是否有“更好的方法”来实现这一目标?

0 投票
2 回答
144 浏览

c++ - 两个元组的编译时集减法

我有一个应用程序,我正在从参数包中构造元组:

我有另一个元组类型 B 定义为:

有没有办法获得一个新的 tuple C,例如在集合和编译时C对集合中的类型进行集合减法?AB

完整问题的更多上下文:

我可以通过上述方法找到第 0 种类型,但我对第 B 组中不包含的第一种类型感兴趣。所以,有点像编译时搜索来查找第一个有效类型。

0 投票
0 回答
69 浏览

c++ - 对静态 constexpr 的未定义引用,如果作为函数参数包与 O0 一起传递(适用于更高的优化级别)

以下代码片段只有在优化级别高于 O0 时才能链接:

你可以在这里运行它:http: //cpp.sh/3dv7p

使用 O0 配置 C++11/14 将失败,并出现以下链接器错误:

选择 O1、O2 或 O3 将成功链接,程序执行返回预期的输出。

解决方案

结果表明,这个问题与可变参数模板函数无关。static constexpr唯一的问题是,编译器优化是否在编译时 (>O0) 或链接时 (O0) 期间替换了该成员。在后一种情况下, 的声明X::a也需要一些有效的定义。这可以通过添加constexpr int X::a;到上面的代码片段来完成。然后生成的代码片段将链接到任何优化级别:

请注意,对于static constexpr成员,必须在声明期间进行初始化,以获得完整的类型,而不是在定义期间。

为了让编译器在编译时已经替换,同样使用 O0,不X::a应该传递对的引用。这就是为什么这个片段也会成功链接到 O0,即使它没有定义X::a

0 投票
1 回答
84 浏览

c++ - 为什么参数包不扩展为正确的类型?

我有一段有点做作的代码:

ARGs... = { int }为什么编译器在第一种情况下努力解决这个问题?std::function<void(int)>如果我通过在签名中使用来帮助编译器(第二种情况),则代码可以编译。在这两种情况下,编译器都可以毫不费力地推断出const ARGs&...应该是const int&. 使用 C++17。

海合会:

铛:

0 投票
2 回答
59 浏览

c++ - 参数包参数类型

我已经修改了https://en.cppreference.com/w/cpp/language/parameter_pack中的示例,以将字符串保存在变量中。我的代码

编译代码时出现以下错误:

我认为参数包扩展到

  1. tprintf(std::string&, const std::string&, std::string, int)<-argstd::string
  2. tprintf(std::string&, const std::string&, int)<-argint,我可以打电话std::to_string(arg) 但似乎arg有另一种类型而不是intstd::string或其他)?当我删除std::to_string呼叫时,我得到了一些神秘的字符。

如何将年龄的值转换为 astring并将其附加到str

0 投票
3 回答
71 浏览

c++ - 比较不同长度的成员参数包

这里我定义了两个参数包之间的兼容性检查。实际的成员检查比相等检查更复杂,所以我不能回退到is_same<integer_sequence<int, TVals...>, integer_sequence<int, UVals...>>. 我必须自己检查每个成员。

  • are_compatibles<type<1, 2>, type<1, 2>>::value == true;编译。
  • are_compatibles<type<1, 2>, type<2, 1>>::value == false编译。
  • are_compatibles<type<1, 2>, type<1>>::value == false无法编译,因为参数包的长度不同。

有没有办法比较不同长度的成员参数包?