Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah anda mengira offset tatasusunan automatik menggunakan templat variadic dalam C?

Bagaimanakah anda mengira offset tatasusunan automatik menggunakan templat variadic dalam C?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-02 21:58:30616semak imbas

How do you calculate automatic array offsets using variadic templates in C  ?

Mencipta Pemula Tatasusunan daripada Parameter Templat Tuple atau Variadic

Templat variadik menawarkan penyelesaian kepada keperluan pengiraan offset automatik dalam permulaan tatasusunan . Dengan mewakili setiap elemen sebagai pengecam dan saiznya, jujukan boleh dibuat yang memacu pengiraan offset.

Struktur Reka Letak digunakan untuk menyimpan entri:

<code class="cpp">template<std::size_t offset, typename Key, typename... Entries>
struct LayoutHelper {
  typedef std::tuple<> type;
};
template<typename Key, typename... Entries>
struct Layout:LayoutHelper<0, Key, Entries...> {};</code>

Setiap entri mempunyai pengecam dan jenis atau saiz:

<code class="cpp">template<typename Key, Key identifier, typename Data>
struct Entry {};</code>

Untuk membuat entri yang diproses, kami melanjutkan konsep:

<code class="cpp">template<std::size_t offset, typename Key, Key id0, typename D0, typename... Entries>
struct LayoutHelper<offset, Key, Entry<Key, id0, D0>, Entries...>
{
    typedef typename prepend
        < ProcessedEntry< Key, id0, D0, offset >
        , typename LayoutHelper<offset+sizeof(D0), Key, Entries...>::type
        > type;
};</code>

Penggunaan kelihatan seperti ini:

<code class="cpp">Layout< FooEnum, Entry< FooEnum, eFoo, char[10] >, Entry< FooEnum, eFoo2, double > > layout;</code>

Selepas mencari pelaksanaan prapend yang menambahkan elemen pada bahagian hadapan tuple, Layout::type akan mewakili tuple yang menyatakan reka letak data. Hasil ini kemudiannya boleh digunakan untuk membina std::array dengan membongkar entri menggunakan teknik indeks.

Atas ialah kandungan terperinci Bagaimanakah anda mengira offset tatasusunan automatik menggunakan templat variadic dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn