C ++ zip variadische Vorlagen

8

Hier ist eine einfache Zwei-Container-Zip-Funktion in C ++:

%Vor%

Wie würde ich das auf eine beliebige Anzahl von Containern mit variantenspezifischen Vorlagen erweitern?

Ich möchte, dass general_zip eine tuple von list s akzeptiert (jede Liste kann einen anderen Typ enthalten) und gibt list von tuple s zurück.

    
user 02.05.2012, 19:29
quelle

3 Antworten

13

Es scheint, als ob das funktionieren sollte

%Vor%

@Potatoswatter hatte die gute (IMO) Bemerkung, dass dies mehr als nötig kopieren könnte, wenn die Listen unterschiedlich groß sind, und dass nur die Verwendung von Iteratoren besser ist, da pop_front mehr benötigt, als tatsächlich benötigt wird. Ich denke, das Folgende "repariert" den Iterator auf Kosten von mehr Code.

%Vor%     
Johannes Schaub - litb 02.05.2012, 21:40
quelle
4

Dies ist eine schrittweise Verbesserung gegenüber Johannes 'erster Antwort. Es vermeidet den Dummy struct und vermeidet das Kopieren der gesamten Eingabelisten (obwohl dies nicht viel bedeutet, es sei denn eine Liste ist kürzer als die anderen). Außerdem habe ich es generisch über alle Container gemacht.

Aber es erfordert einen Standard-Pack-Index-Generator, der sowieso ziemlich nützlich ist

%Vor%

Die "echte" Implementierung besteht aus einer einfachen Funktion, die die Ausgabe von dem obigen Dienstprogramm benötigt, und einer Schnittstellenfunktion, die Pakete mit Tupeln abbildet.

%Vor%

Zumindest relativiert das, was Johannes gemacht hat, einfach. So sehen die meisten variadischen Template-Algorithmen aus, da es keine Möglichkeit gibt, den Typ-variadic-Zustand ohne tuple zu speichern, und es gibt keine Möglichkeit, ein variadisches Tupel ohne ein Paket von Indizes oder eine meta-rekursive Funktion zu verarbeiten. (Edit: ah, Johannes benutzte nun eine tail-rekursive lokale Funktion, um lokale Packs zu definieren, die das alles ohne tuple machen. Super ... wenn du mit der ganzen funktionalen Programmierung umgehen kannst; v).)

    
Potatoswatter 06.05.2012 14:06
quelle
1

Eine andere Version: eine Mischung aus Johannes und Potatoswatter Antwort, versucht, die Menge an Tricks zu minimieren (die ich trotzdem genoss!)

%Vor%     
Thomas Petit 29.09.2013 14:00
quelle