So iterieren Sie über eine gepackte variadische Vorlagenargumentliste
In C stellt das Iterieren über eine gepackte variadische Vorlagenargumentliste eine Herausforderung dar die Unfähigkeit, die Anzahl der Argumente zu kennen und daraus einzeln Daten abzurufen. Dieses Problem wird durch die Verwendung eines Makros beim Aufbau der Funktion noch verschärft, was rekursive Aufrufe ausschließt.
Um dieses Problem zu beheben, verwendet die bereitgestellte Lösung einen benutzerdefinierten Typ, „any“, der verschiedene Datentypen enthalten kann. Durch die Übergabe dieses Typs an eine variadische Vorlage werden die Argumente in einen Vektor beliebiger Objekte erweitert. Anschließend können die einzelnen Elemente dieses Vektors mithilfe spezieller Getter-Funktionen (get
Obwohl diese Methode die Aufgabe erfüllt, erfordert sie dennoch Ausführliche Funktionsaufrufe wie foo(arg(1000)). Um dies zu vereinfachen, suchen wir nach einer prägnanteren Iterationsmethode oder einem Äquivalent von std::get() für gepackte variadische Vorlagenargumentlisten.
Lösung mit STL Fold Expressions und Lambda
Für C 17 und höher können Faltausdrücke zusammen mit einer Lambda-Funktion verwendet werden, um eine Iteration zu erreichen. Das Lambda kann innerhalb der Schleife beliebige Operationen ausführen, einschließlich der Erhöhung eines Zählers und der Ausgabe des aktuellen Arguments:
<code class="cpp">template <class ... Ts> void Foo (Ts && ... inputs) { int i = 0; ([&] { // Do things in your "loop" lambda ++i; std::cout << "input " << i << " = " << inputs << std::endl; } (), ...); }</code>
Diese Methode bietet einen prägnanteren und lesbareren Iterationsmechanismus.
Alternativen zum Umgang mit Schleifenunterbrechungen
Während die oben genannte Lösung die Aufgabe erfüllt, fehlt ihr die Fähigkeit, Unterbrechungen oder Rückläufe innerhalb der Schleife zu implementieren. Um dieses Problem zu beheben, können wir Problemumgehungen verwenden wie:
Das obige ist der detaillierte Inhalt vonWie können wir eine gepackte variadische Vorlagenargumentliste präzise durchlaufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!