gpt4 book ai didi

c++ - integer_sequence 如何展开以生成序列?

转载 作者:行者123 更新时间:2023-11-27 23:43:56 24 4
gpt4 key购买 nike

我有这段代码可以生成 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 .但这就是为什么它来自 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> 的别名.因此,当 make_inc_array_impl使用此类型的参数调用,Is...被推断为 0 1 2 3 4 5 6 7 8 9为了使参数类型为std::integer_sequence<int, Is...>等于参数类型。最后,这个包在make_inc_array_impl的正文中展开.包扩展保证按顺序发生,所以它变成 0 + 1 , 1 + 1 , ..., 9 + 1 .

其中最棘手的部分是 std::make_integer_sequence .它如何扩展为 std::integer_sequence专门化所需的实际连续整数?好吧,这已被插入到标准库中,因此您不必自己记住如何做,但如果您想查看答案,请查看 here .

您通常需要一个用 std::make_integer_sequence<int, N>{} 的结果调用的辅助函数这样就有一个地方可以将各个整数放入序列中,Is... .现在您已经了解了这个技巧,您将开始看到许多可以使用它的地方。

关于c++ - integer_sequence 如何展开以生成序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52323421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com