Erstellen eines Array-Initialisierers aus einem Tupel oder variadischen Vorlagenparametern
Variadische Vorlagen bieten eine Lösung für die Notwendigkeit einer automatischen Offset-Berechnung bei der Array-Initialisierung . Indem jedes Element als Bezeichner und seine Größe dargestellt wird, kann eine Sequenz erstellt werden, die die Berechnung von Offsets steuert.
Eine Layoutstruktur wird verwendet, um die Einträge zu speichern:
<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>
Jeder Eintrag hat einen Bezeichner und einen Typ oder eine Größe:
<code class="cpp">template<typename Key, Key identifier, typename Data> struct Entry {};</code>
Um einen verarbeiteten Eintrag zu erstellen, erweitern wir das Konzept:
<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>
Die Verwendung sieht so aus:
<code class="cpp">Layout< FooEnum, Entry< FooEnum, eFoo, char[10] >, Entry< FooEnum, eFoo2, double > > layout;</code>
Nachdem Sie eine Prepend-Implementierung gefunden haben, die Elemente am Anfang eines Tupels hinzufügt, stellt Layout
Das obige ist der detaillierte Inhalt vonWie berechnet man automatische Array-Offsets mithilfe von Variadic-Vorlagen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!