Heim  >  Artikel  >  Backend-Entwicklung  >  Wie iteriere ich über gepackte variadische Vorlagenargumentlisten in C?

Wie iteriere ich über gepackte variadische Vorlagenargumentlisten in C?

Susan Sarandon
Susan SarandonOriginal
2024-10-23 18:09:02476Durchsuche

How to Iterate Over Packed Variadic Template Argument Lists in C  ?

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:

  • Mit Try/Throw: Ausnahmen auslösen, um der Schleife zu entkommen. Hinweis: Dieser Ansatz kann die Funktion erheblich verlangsamen.
  • Variable/If-Schalter: Verwenden Sie eine Switch-Anweisung, die von einer Variablen gesteuert wird, die jeden Typ darstellt. Dies ist nicht ideal, kann aber Return/Break-Anweisungen verarbeiten.

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!

Stellungnahme:
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