So durchlaufen Sie ein Parameterpaket mithilfe einer Paketerweiterung
Bei der Verwendung verschiedener Vorlagen und Funktionen ist es wichtig, die Verwendung von Paketen zu verstehen Erweiterungen. Betrachten Sie den folgenden Code:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); }
Beim Kompilieren schlägt dieser Code mit dem Fehler fehl:
Error C3520: 'args': parameter pack must be expanded in this context
Die Lösung: Pack Expansion in Braced-Init-List
Um dieses Problem zu beheben, können Sie eine Paketerweiterung innerhalb eines verwenden braced-init-list:
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Grundlegendes zur Braced-Init-List
Die Initialisierungsliste innerhalb der Array-Definition erweitert die Paketerweiterung in eine durch Kommas getrennte Datei Liste. Die Umwandlung in void stellt sicher, dass der verwendete Kommaoperator der integrierte ist und keine überladenen Versionen. Dies garantiert eine Auswertung der Paketerweiterung von links nach rechts.
Zusätzliche Optionen mit C 17
In C 17 können Sie den Code mithilfe von Faltausdrücken vereinfachen:
((void) bar(std::forward<Args>(args)), ...);
Fazit
Durch die Nutzung einer Paketerweiterung innerhalb eines Mit braced-init-list oder einem Fold-Ausdruck in C 17 können Sie ein Parameterpaket effektiv durchlaufen und Kompilierungsfehler vermeiden. Das Verständnis dieser Technik ist für die Arbeit mit verschiedenen Vorlagen und Funktionen in C von entscheidender Bedeutung.
Das obige ist der detaillierte Inhalt vonWie kann man ein Parameterpaket in Variadic-Vorlagen korrekt durchlaufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!