[英]How does integer_sequence get unfolded to generate a sequence?
我有这段代码生成一个1到10的编译时数组
template <int... Is> // when called below, Is will be 0 - N
constexpr std::array<int, sizeof...(Is)>
make_inc_array_impl(std::integer_sequence<int, Is...>) {
return {{(Is + 1)...}}; // +1 to start at one instead of [0, 1, ...]
}
template <std::size_t N>
constexpr std::array<int, N> make_inc_array() {
return make_inc_array_impl(std::make_integer_sequence<int, N>{});
}
constexpr auto a = make_inc_array<10>(); // [1, 2, ..., 10]
int main() {
for(int itr = 0; itr < 10; ++itr)
printf("%d ", a[itr]);
}
好吧,我对元编程的工作方式有一些经验和知识。 但是我仍然不知道这个惊人的例子是如何工作的。
从make_inc_array_impl()
我看到,它返回(Is+1)...
因此,应的结果是[11, 10, 9, 8, 7, ... 2]
因为Is
值从开始10
?
可变参数模板函数make_integer_sequence(parameter pack)
展开/扩展std::integer_sequence<int, Is...>
吗? 在正常的元编程中,模板推导从N
递归地工作到N-1
,低至1
。 但是,为什么它从1
到N
?
您能解释一下背后的原理吗?
调用make_inc_array<10>()
将返回make_inc_array_impl(std::make_integer_sequence<int, 10>{})
。 std::make_integer_sequence
是别名模板。 特别地,它被实现为使std::make_integer_sequence<int, 10>
是类型std::integer_sequence<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>
std::make_integer_sequence<int, 10>
的别名。 因此,当使用此类型的参数调用make_inc_array_impl
时, Is...
推导为0 1 2 3 4 5 6 7 8 9
以使参数类型std::integer_sequence<int, Is...>
相等参数类型。 最后,此包在make_inc_array_impl
的主体中make_inc_array_impl
。 保证包扩展按顺序发生,因此它变为0 + 1
1 + 1
,..., 9 + 1
。
最棘手的部分是std::make_integer_sequence
。 如何将其扩展为具有所需的实际连续整数的std::integer_sequence
专长? 好的,这是插入到标准库中的,这样您就不必自己记住如何做,但是如果您想查看答案,请看这里 。
通常,您需要一个助手函数,该函数将以std::make_integer_sequence<int, N>{}
的结果调用,以便有一个位置将单个整数放入序列中, 即,包Is...
现在您已经知道了这个技巧,您将开始看到许多可以使用它的地方。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.