Heim >Backend-Entwicklung >C++ >Wie kann ich ein C-Parameterpaket korrekt durchlaufen, um Compilerfehler zu vermeiden?
Durchlaufen von Parameterpaketen mit Paketerweiterung
In Variadic-Vorlagen ermöglichen Parameterpakete die Übergabe einer flexiblen Anzahl von Argumenten an eine Funktion . Beim Versuch, über ein Parameterpaket zu iterieren, kann ein Compilerfehler auftreten, wenn das Paket nicht ordnungsgemäß erweitert wird.
Beachten Sie den folgenden Code:
template<typename... Args> static void foo2(Args... args) { (bar(args)...); // Error: parameter pack must be expanded }
Dieser Code schlägt mit dem Fehler beim Kompilieren fehl „Fehler C3520: ‚args‘: Parameterpaket muss in diesem Kontext erweitert werden.“ Der Grund für diesen Fehler liegt darin, dass die Argumente des Parameterpakets erweitert werden müssen, bevor sie im Bar-Funktionsaufruf verwendet werden können.
Eine Möglichkeit, diese Erweiterung zu erreichen, ist die Verwendung einer geschweiften Init-Liste (Initialisierungsliste in geschweiften Klammern eingeschlossen). Durch Platzieren der Erweiterung in der Initialisierungsliste eines Dummy-Arrays kann der Compiler die erforderliche Erweiterung durchführen.
template<typename... Args> static void foo2(Args &&&... args) { int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... }; }Die Initialisierungsliste ermöglicht die Erweiterung des gesamten Pakets, und die Umwandlung in void stellt sicher, dass das Komma Der Operator wird verwendet, unabhängig von überlasteten Operatoren für den Rückgabetyp „bar“.Ein alternativer Ansatz, der in C 17 eingeführt wurde, ist die Verwendung von
fold Ausdrücke:
((void) bar(std::forward<Args>(args)), ...);Dieser Code bietet eine präzise und effiziente Möglichkeit, das Parameterpaket zu durchlaufen.
Das obige ist der detaillierte Inhalt vonWie kann ich ein C-Parameterpaket korrekt durchlaufen, um Compilerfehler zu vermeiden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!