Heim >Backend-Entwicklung >C++ >Wie kann ich mithilfe der Paketerweiterung über ein Parameterpaket in C iterieren?
Variadic-Vorlagen: Pack-Erweiterung für die Iteration enträtseln
Variadic-Vorlagen verleihen in C eine bemerkenswerte Ausdruckskraft, aber wenn man sich in ihr Reich vorwagt, kann man unvorhergesehene Komplexitäten offenbaren. Eine solche Herausforderung entsteht, wenn versucht wird, mithilfe der Paketerweiterung über ein Parameterpaket zu iterieren. Betrachten Sie den folgenden Code:
template<typename T> static void bar(T t) {} template<typename... Args> static void foo2(Args... args) { (bar(args)...); } int main() { foo2(1, 2, 3, "3"); return 0; }
Beim Kompilieren tritt in diesem Code ein Fehler auf: „‚args‘: Parameterpaket muss in diesem Kontext erweitert werden.“ Das Problem ergibt sich aus der Unfähigkeit, ein Parameterpaket in einem Funktionsaufruf direkt zu erweitern.
Die Lösung liegt in der Verwendung der Paketerweiterung innerhalb einer geschweiften Init-Liste, einem Kontext, der eine solche Erweiterung explizit zulässt. Indem wir die Erweiterung in die Initialisierungsliste eines Dummy-Arrays einfügen, können wir das gewünschte Verhalten erzwingen:
template<typename... Args> static void foo2(Args &&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }
Dieser überarbeitete Code verfolgt einen sorgfältigen Ansatz, um eine korrekte Auswertung sicherzustellen:
In C 17 bieten Faltausdrücke eine noch kompaktere Lösung:
((void) bar(std::forward<Args>(args)), ...); ``` This approach guarantees the desired left-to-right expansion unequivocally.
Das obige ist der detaillierte Inhalt vonWie kann ich mithilfe der Paketerweiterung über ein Parameterpaket in C iterieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!