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?
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.
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:
Und dann kannst du es so nennen:
%Vor%Tags und Links c++ c++11 templates variadic-templates