Jör*_*son 9 c++ templates variadic-templates c++11
所以我试图弄清楚它是如何工作的:C++ 11:我可以从多个args转到元组,但是我可以从元组转到多个args吗?
我不明白的黑魔法是这段代码片段:
f(std::get<N>(std::forward<Tuple>(t))...)
Run Code Online (Sandbox Code Playgroud)
这f
是我不明白的内心表达.
我理解表达式以某种方式解压缩/扩展内部t
的参数列表.但有人可以解释如何做到这一点?当我看到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开始:
包扩展由模式和省略号组成,其实例化在列表中产生零个或多个模式的实例化.
在您的情况下,当您完成递归模板实例化并最终进入部分特化时,您就拥有了
f(std::get<N>(std::forward<Tuple>(t))...);
Run Code Online (Sandbox Code Playgroud)
......这里N
是四个参数包int
S( ,,0
和).从上面的标准来看,这里的模式是1
2
3
std::get<N>(std::forward<Tuple>(t))
Run Code Online (Sandbox Code Playgroud)
将...
省略号应用于上述模式使其以列表形式扩展为四个实例,即
f(std::get<0>(t), std::get<1>(t), std::get<2>(t), std::get<3>(t));
Run Code Online (Sandbox Code Playgroud)