簡體   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