从元组中解压缩参数

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不是类型序列,而是整数.但我猜这种语言结构适用于类型和值.

Nat*_*ohl 6

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

包扩展由模式省略号组成,其实例化在列表中产生零个或多个模式的实例化.

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

f(std::get<N>(std::forward<Tuple>(t))...);
Run Code Online (Sandbox Code Playgroud)

......这里N是四个参数包intS( ,,0 和).从上面的标准来看,这里的模式123

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)