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.
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% 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).)
Eine andere Version: eine Mischung aus Johannes und Potatoswatter Antwort, versucht, die Menge an Tricks zu minimieren (die ich trotzdem genoss!)
%Vor%Tags und Links c++ c++11 variadic-templates iterator tuples