Heim > Backend-Entwicklung > C++ > Wie kann ich ein C-Parameterpaket mithilfe der Paketerweiterung korrekt durchlaufen?

Wie kann ich ein C-Parameterpaket mithilfe der Paketerweiterung korrekt durchlaufen?

Mary-Kate Olsen
Freigeben: 2025-01-04 05:41:39
Original
148 Leute haben es durchsucht

How Can I Correctly Loop Through a C   Parameter Pack Using Pack Expansion?

Durchlaufen von Parameterpaketen mit Paketerweiterung

Im bereitgestellten Codeausschnitt beabsichtigen Sie, ein Parameterpaket variabler Länge mithilfe von zu durchlaufen Pack-Erweiterungssyntax. Allerdings schlägt die Kompilierung des Codes mit der Fehlermeldung „Parameterpaket muss in diesem Kontext erweitert werden“ fehl.

Um dieses Problem zu beheben, müssen Sie die Paketerweiterung in einen Kontext platzieren, in dem sie zulässig ist. Ein geeigneter Ort ist innerhalb einer Klammer-Init-Liste. Betrachten Sie den folgenden geänderten Code:

template<typename... Args>
static void foo2(Args &&... args)
{
    int dummy[] = { 0, ( (void) bar(std::forward<Args>(args)), 0) ... };
}
Nach dem Login kopieren

So funktioniert es:

  • Der Code in der Initialisierungsliste des Dummy-Arrays ist in {} eingeschlossen.
  • Die Pack-Erweiterungssyntax wird innerhalb der Initialisierungsliste verwendet. Insbesondere wird ( (void) bar(std::forward(args)), 0) für jeden Parameter im Paket erweitert.
  • Der Kommaoperator wird verwendet, um jeden Ausdruck zu trennen, um sicherzustellen, dass der Die Funktion bar() wird für jeden Parameter aufgerufen.
  • Die Klammern um bar(std::forward(args)) werden zum Umwandeln verwendet das Ergebnis ungültig. Dadurch wird sichergestellt, dass der integrierte Kommaoperator verwendet wird und kein überladener.
  • Das Dummy-Array wird mit mindestens einem Element erstellt, um die Erstellung eines illegalen Arrays der Länge 0 zu vermeiden, wenn das Parameterpaket leer ist.

Mit dieser Änderung wird der Code erfolgreich kompiliert und das Parameterpaket durchlaufen.

C 17 Fold Ausdrücke

In C 17 können Sie den Code mithilfe von Faltausdrücken vereinfachen:

((void) bar(std::forward<Args>(args)), ...);
Nach dem Login kopieren

Dieser Ausdruck erweitert das Paket und wendet die angegebene Operation an (in diesem Fall der Aufruf von bar( )) von links nach rechts.

Das obige ist der detaillierte Inhalt vonWie kann ich ein C-Parameterpaket mithilfe der Paketerweiterung korrekt durchlaufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage