繁体   English   中英

整数序列如何展开以生成序列?

[英]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]);
}

好吧,我对元编程的工作方式有一些经验和知识。 但是我仍然不知道这个惊人的例子是如何工作的。

  1. make_inc_array_impl()我看到,它返回(Is+1)...因此,应的结果是[11, 10, 9, 8, 7, ... 2]因为Is值从开始10

  2. 可变参数模板函数make_integer_sequence(parameter pack)展开/扩展std::integer_sequence<int, Is...>吗? 在正常的元编程中,模板推导从N递归地工作到N-1 ,低至1 但是,为什么它从1N

您能解释一下背后的原理吗?

调用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM