Übergeben von std :: array als Argumente der variadischen Template-Funktion

8

Ich versuche, über variadische Vorlagen in C ++ 11 zu lernen. Ich habe eine Klasse, die im Grunde ein Wrapper um ein std::array ist. Ich möchte Funktionsobjekte (idealerweise lambdas) an eine Elementfunktion übergeben und dann die Elemente von std::array als Parameter des Funktionsobjekts übergeben lassen.

Ich habe eine static_assert verwendet, um zu überprüfen, ob die Anzahl der Parameter mit der Länge des Arrays übereinstimmt, aber ich kann mir keine Möglichkeit vorstellen, die Elemente als Argumente zu übergeben.

Hier ist der Code

%Vor%

Also meine Frage (wie im Code angegeben) ist, wie kann man die Einträge von data auf die Funktion func in einer Weise übergeben, die generisch ist mit N ?

Bonusfrage: Ist es möglich, die unansehnliche Konvertierung in std::function in main zu beenden und direkt ein Lambda zu übergeben?

    
Dan 30.05.2013, 11:21
quelle

2 Antworten

11

Angesichts der bekannten Index-Infrastruktur:

%Vor%

Sie könnten Ihre Klassenvorlage auf diese Weise neu definieren:

%Vor%

Hier ist ein Live-Beispiel .

Beachten Sie, dass Sie kein std::function -Objekt in main() erstellen müssen: Das std::function kann implizit aus dem Lambda erstellt werden. Sie müssen jedoch nicht einmal std::function verwenden, wodurch möglicherweise unnötiger Laufzeitaufwand entsteht.

In der obigen Lösung lasse ich den Typ des Callable Objects als Template-Parameter, der vom Compiler abgeleitet werden kann.

    
Andy Prowl 30.05.2013, 11:34
quelle
1

Sie können diese Dienstprogrammvorlage verwenden, um beim Kompilieren eine Reihe von Indizes zu erstellen:

%Vor%

Machen Sie dann eine Aufruferfunktion, die indices als Parameter verwendet, damit Sie die Indexreihenfolge ableiten können:

%Vor%

Und dann kannst du es so nennen:

%Vor%     
jrok 30.05.2013 11:36
quelle