c – 从元组中解包参数
作者:互联网
所以我想弄清楚它是如何工作的: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