SHAMELESS COPY [von der Quelle genehmigt]
Parameterpakete können nur in einer genau definierten Liste von Kontexten erweitert werden, und der Operator ,
ist keiner von ihnen. Mit anderen Worten, es ist nicht möglich, die Pack-Erweiterung zu verwenden, um einen Ausdruck zu generieren, der aus einer Reihe von vom Operator begrenzten Unterausdrücken besteht ,
.
Als Faustregel gilt: "Durch Erweiterung kann eine Liste mit ,
getrennten Mustern erstellt werden, wobei ,
ein Listenbegrenzer vorhanden ist." Der Operator erstellt ,
keine Liste im Sinne der Grammatik.
Um eine Funktion für jedes Argument aufzurufen, können Sie die Rekursion verwenden (dies ist das Hauptwerkzeug in der Box des Programmierers für verschiedene Vorlagen):
#include <utility>
template<typename T>
void foo(T &&t){}
template<typename Arg0, typename Arg1, typename ... Args>
void foo(Arg0 &&arg0, Arg1 &&arg1, Args &&... args){
foo(std::forward<Arg0>(arg0));
foo(std::forward<Arg1>(arg1), std::forward<Args>(args)...);
}
auto main() -> int{
foo(1, 2, 3, "3");
}
NÜTZLICHE NICHT KOPIERTE INFO
Eine andere Sache, die Sie in dieser Antwort wahrscheinlich nicht gesehen haben, ist die Verwendung des &&
Bezeichners und std::forward
. In C ++ kann der &&
Bezeichner eines von zwei Dingen bedeuten: rWertreferenzen oder universelle Referenzen.
Ich werde nicht auf r-Wert-Referenzen eingehen, sondern auf jemanden, der mit verschiedenen Vorlagen arbeitet. universelle Referenzen sind ein Geschenk Gottes.
Perfekte Weiterleitung
Eine der Verwendungszwecke std::forward
und universellen Referenzen ist die perfekte Weiterleitung von Typen an andere Funktionen.
Wenn wir in Ihrem Beispiel eine int&
an übergeben foo2
, wird diese int
aufgrund der Signatur der generierten foo2
Funktion nach dem Abzug der Vorlage automatisch herabgestuft. Wenn Sie diese dann arg
an eine andere Funktion weiterleiten möchten, die sie durch Referenz ändern würde, erhalten Sie unerwünschte Ergebnisse ( Die Variable wird nicht geändert, da foo2
ein Verweis auf die temporäre Variable übergeben wird , die durch Übergabe eines int
an sie erstellt wurde. Um dies zu umgehen , geben wir eine Weiterleitungsfunktion an, mit der jede Art von Referenz auf eine Variable (rvalue oder lvalue) verwendet werden kann. Dann, um sicherzugehen, dass wir den genauen Typ übergeben, der in der von uns verwendeten Weiterleitungsfunktion übergeben wurde std::forward
, dann und nurdann erlauben wir die Herabstufung von Typen; weil wir jetzt an dem Punkt sind, an dem es am wichtigsten ist.
Wenn nötig, lesen Sie mehr über universelle Referenzen und perfekte Weiterleitung . Scott Meyers ist eine großartige Ressource.
Args
es leer wäre?