Wie erstelle ich einen neuen Tupel-Typ aus einem alten und einen Typ in Boost?

9

Ich habe einen Tupeltyp. Ich möchte einen Elementtyp hinzufügen, um einen neuen Tupel-Typ zu erhalten. Ich kann es tun wie

%Vor%

Allerdings finde ich nicht tuple_cat in boost::tuple , wie geht das in Boost?

    
user1899020 14.07.2013, 20:00
quelle

2 Antworten

7

Ich nehme an, dass Sie das alles in der Kompilierzeit wollen.

Hier ist die allgemeine Erklärung: konkatening Tupel ist ähnlich zu konkatening Listen oder Arrays, ist, dass der Algorithmus der gleiche ist. Hier, mit den Tupeln a und b , habe ich das letzte Element von a an den Anfang von b gesetzt und wiederhole es, bis a leer ist.

Zuerst: Grundstrukturen. Die folgende Struktur enthält ein Parameterpaket. Es kann alles sein, zum Beispiel ein Tupel:

%Vor%

Beachten Sie, dass die Größe des Pakets darin gespeichert ist. Es ist nicht obligatorisch, aber es ist bequem für die Erklärung. Boost verwendet die Struktur boost::tuples::length<T>::value (die ausführlicher ist).

Um auf ein Element an der i-ten Position zuzugreifen, verwenden wir eine ähnliche Struktur wie boost::tuples::element<n, T> :

%Vor%

Nun müssen wir eine Low-Level-Operation verwenden, die ein Element zu einer Seite eines Packs hinzufügt (Hinzufügen links oder rechts). Hier wird links hinzugefügt, aber es ist nicht die einzige Wahl:

%Vor%

Bei Vorlagen wird a nicht geändert. Stattdessen verwenden wir eine Indice, um zu ermitteln, welches Element hinzugefügt werden soll. Die Vererbung definiert einen 'type' typedef, der die Verkettung aller Indizes nach n und dem anderen Tupel darstellt (ohne n und in der Reihenfolge). Wir müssen nur links das Element bei indice n verketten.

%Vor%

Und das ist es! Live-Beispiel hier .

Nun zu Tupel-Besonderheiten: Sie haben bemerkt, dass ich boost :: tuple und std :: tuple nicht verwendet habe. Dies liegt daran, dass viele Implementierungen von Boost-Tupel keinen Zugriff auf variadische Vorlagen haben, so dass eine feste Anzahl von Template-Parametern verwendet wird (standardmäßig boost::tuples::null_type ). Dies direkt mit variadischen Templates zu tun ist ein Kopfzerbrechen, daher ist es notwendig, eine andere Abstraktion zu haben.

Ich habe auch angenommen, dass Sie C ++ 11 verwenden können (mit dem decltype in Ihrer Frage). 2 Tupel in C ++ 03 zu kombinieren, ist möglich, aber mehr Wiederholungen und langweilig.

Sie können ein pack sehr einfach in ein Tupel konvertieren: Ändern Sie einfach die pack Definition in:

%Vor%     
Synxis 14.07.2013, 22:03
quelle
1

C ++ 14 bietet eine Bibliothek zum Generieren einer Sequenz von Ganzzahlen beim Kompilierungstyp. Dies hilft dabei, statische Sequenzen wie Tupel und Arrays zu manipulieren ( Beispiel ). Eine ganzzahlige Sequenz kann erhalten werden

%Vor%

Um concat MyTuple und MyType zu erstellen, können Sie die einfachen Funktionen schreiben:

%Vor%     
a.lasram 14.07.2013 22:40
quelle

Tags und Links