TMP C ++和参数包

时间:2016-04-28 13:47:23

标签: c++ c++11

template<std::size_t... Is>
void unlock_(std::index_sequence<Is...>) {

    iter(std::get<Is>(tuple)...);
}

让我们考虑上面的例子。我无法理解iter(std::get<Is>(tuple)...);。我知道...正在扩展“运营商”。因此它应该应用于参数包(在意义参数中)或模板参数包。 我可以想象std::index_sequence<Is...>是什么。因为Is是模板参数包,所以它应该只是1, 2, 3, 4, ...(例如)。 在这种情况下,out参数是特定的,因为它不是类型。它是size_t

但是在这里:std::get<Is>(tuple)...); std::get<Is>(tuple)不返回参数/模板包,因此我无法使用上下文。

P.S。有可能看到代码在元编程后的样子吗?与预处理后相似?

提前致谢。

1 个答案:

答案 0 :(得分:2)

这是一种通过生成编译时索引序列来扩展std::tuple的方法。

在此上下文中,

...扩展包含未展开参数包的表单。它将生成如下列表:

Is...
0,1,2,...

doSomething(Is)...
doSomething(0), doSomething(1), doSomething(2), ...

doSomething(Is...)
doSomething(0,1,2,...)

std::get<Is>(tuple)...
std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), ...

iter(std::get<Is>(tuple)...)
iter(std::get<0>(tuple), std::get<1>(tuple), std::get<2>(tuple), ...)

效果是使用从元组中提取的参数调用iter