Iterieren über gepackte variadische Vorlagenargumentlisten
In C stellt das Iterieren über eine gepackte variadische Vorlagenargumentliste aufgrund des Fehlens besondere Herausforderungen dar Reflexionsfähigkeiten zur Kompilierungszeit. Es gibt jedoch Techniken, mit denen wir diese Aufgabe bewältigen können.
Das Problem verstehen
Das Ziel besteht darin, eine Reihe von Vorlagenargumenten zu durchlaufen und dabei spezifische Daten zu extrahieren Typen (z. B. int, char*, float) und speichern sie in separaten Vektoren. Darüber hinaus ist ein Vektor erforderlich, um die Reihenfolge zu verfolgen, in der Argumente erschienen sind.
Annäherung an die Lösung
Verwenden von Faltausdrücken mit Lambda:
Für gemischte Eingaben können neben einem Lambda-Ausdruck C 17-fache Ausdrücke verwendet werden. Das Lambda kapselt das Schleifenverhalten, erhöht einen Zähler und gibt den Wert jeder Eingabe zusammen mit ihrer Position aus.
<code class="cpp">template<class ... Ts> void Foo(Ts && ... inputs) { int i = 0; ([&]() { ++i; std::cout << "input " << i << " = " << inputs << std::endl; }(), ...); }
Umgang mit Return-/Break-Anweisungen:
Wenn return or Wenn innerhalb der Schleife Break-Anweisungen erforderlich sind, können Problemumgehungen implementiert werden:
Benutzerdefinierter Makro-Ansatz:
Ein alternativer Ansatz besteht darin, ein benutzerdefiniertes Makro zu erstellen, das einen Typ erstellt enthält alle Argumente und erweitert sie dann innerhalb eines Vektors. Obwohl dies eine nicht standardmäßige Methode ist, kann sie die gewünschte Funktionalität erreichen.
<code class="cpp">struct any { void do_i(int e) { INT = e; } void do_f(float e) { FLOAT = e; } void do_s(char* e) { STRING = e; } int INT; float FLOAT; char* STRING; }; #define def(name) \ template<typename... T> \ auto name(T... argv) -> any { \ std::initializer_list<any> argin = { argv... }; \ std::vector<any> args = argin; #define get(name, T) get<T>()(args[name]) #define end }</code>
Dieser Ansatz erfordert den manuellen Aufruf von arg()-Funktionen, um eine beliebige Instanz für jedes Argument zu erstellen.
Fazit
Das Iterieren über gepackte variadische Vorlagenargumentlisten in C erfordert innovative Lösungen. Die hier besprochenen Ansätze gehen diese Herausforderung an und ermöglichen eine effiziente Handhabung gemischter Argumente bei gleichzeitiger Wahrung der Portabilität und plattformübergreifenden Kompatibilität.
Das obige ist der detaillierte Inhalt vonWie iteriere ich über gepackte variadische Vorlagenargumentlisten in C?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!