ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c – 从元组中解包参数

2019-10-01 03:07:36  阅读:267  来源: 互联网

标签:c c11 templates variadic-templates


所以我想弄清楚它是如何工作的:C++11: I can go from multiple args to tuple, but can I go from tuple to multiple args?

我不明白的黑魔法是这段代码片段:

f(std::get<N>(std::forward<Tuple>(t))...)

这是我不明白的f里面的表达.

我理解表达式以某种方式解压缩/扩展内部的内容到参数列表中.但有人可以解释如何做到这一点?当我看到std :: get(http://en.cppreference.com/w/cpp/utility/tuple/get)的定义时,我看不出N如何适合……?据我所知,N是一个整数序列.

基于我可以观察到的,我假设表达式为E< X> …其中X是X1类型的序列. X2,… Xn,表达式将扩展为E< X1>,E< X2>. …… E< Xn>.这是怎么回事?

编辑:在这种情况下,N不是类型序列,而是整数.但我猜这种语言结构适用于类型和值.

解决方法:

我认为@ Xeo的评论总结得很好.从C 11标准的14.5.3开始:

A pack expansion consists of a pattern and an ellipsis, the
instantiation of which produces zero or more instantiations of the
pattern in a list.

在您的情况下,当您完成递归模板实例化并最终进入部分特化时,您就拥有了

f(std::get<N>(std::forward<Tuple>(t))...);

…其中N是四个整数(0,1,2和3)的参数包.从上面的标准来看,这里的模式是

std::get<N>(std::forward<Tuple>(t))

将…省略号应用于上述模式使其以列表形式扩展为四个实例,即

f(std::get<0>(t), std::get<1>(t), std::get<2>(t), std::get<3>(t));

标签:c,c11,templates,variadic-templates
来源: https://codeday.me/bug/20191001/1837662.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有