[英]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.