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?
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>
:
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.
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:
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: