Erstellen eines Array-Initialisierers aus einem Tupel oder variadischen Vorlagenparametern
Beim Umgang mit persistenten Speicherlayouts, die in den Programmcode eingebettet werden müssen , besteht die Notwendigkeit, die Beschreibung des Layouts statisch darzustellen. Dazu gehört das Binden einer bestimmten ID an das Layout, das Berechnen von Offsets zur Kompilierungszeit und das Erstellen eines Array-Initialisierers, der zur Laufzeit ohne die Einschränkungen von std::get(std::tuple) iteriert werden kann.
Ansatz mit variadischen Vorlagen
Um die Akkumulation zur Kompilierzeit und die Erstellung von Sequenzen zu ermöglichen, sollten Sie die Verwendung variadischer Vorlagen in Betracht ziehen. Jeder Eintrag kann aus einer Kennung und entweder der Größe oder dem Typ eines bestimmten Elements bestehen. Das Eintragsbündel der obersten Ebene wird als „Layout“-Vorlage definiert und jeder Eintrag wird durch eine „Eintrags“-Vorlage dargestellt.
Beispielverwendung
<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>
<code class="cpp">template<typename Key, Key identifier, typename Data> struct Entry {};</code>
So verwenden Sie diesen Ansatz:
<code class="cpp">Layout< FooEnum, Entry< FooEnum, eFoo, char[10]>, Entry< FooEnum, eFoo2, double> > layout;</code>
Nach der Implementierung der Prepend-Vorlage zum Hinzufügen eines Elements am Anfang eines Tupels würde Layout
Zusätzliche Überlegungen
Das obige ist der detaillierte Inhalt vonWie erstelle ich einen statischen Array-Initialisierer aus Tupeln oder variadischen Vorlagen in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!