Heim > Backend-Entwicklung > C++ > Hauptteil

Wie rufe ich eine Funktion für alle variadischen Vorlagenargumente in C auf?

Susan Sarandon
Freigeben: 2024-11-11 03:51:02
Original
250 Leute haben es durchsucht

How to Invoke a Function on All Variadic Template Arguments in C  ?

Variadische C-Vorlagen: Aufrufen einer Funktion für alle Vorlagenargumente

In C ist es häufig wünschenswert, variadische Vorlagenargumente zu durchlaufen und eine bestimmte Operation, z. B. einen Aufruf, auszuführen eine Funktion. Dies kann erreicht werden mit:

C 17 Fold Expression

(f(args), ...);
Nach dem Login kopieren

Wenn die aufgerufene Funktion jedoch möglicherweise ein Objekt mit einem überladenen Kommaoperator zurückgibt, sollten Sie Folgendes verwenden:

((void)f(args), ...);
Nach dem Login kopieren

Pre-C 17-Lösung

Ein gängiger Ansatz besteht darin, die Listeninitialisierung zu nutzen und die Erweiterung darin durchzuführen it:

{ print(Args)... }
Nach dem Login kopieren

Da print() void zurückgibt, können Sie das Problem umgehen, indem Sie int:

{ (print(Args), 0)... }
Nach dem Login kopieren

Um sicherzustellen, dass dies mit einer beliebigen Anzahl von Argumenten funktioniert, können Sie Folgendes tun Packungen enthalten immer mindestens ein Element:

{ 0, (print(Args), 0)... }
Nach dem Login kopieren

Sie können dieses Muster in ein wiederverwendbares Element einkapseln Makro:

namespace so {
    using expand_type = int[];
}

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Nach dem Login kopieren

Um mit überladenen Kommaoperatoren umzugehen, können Sie das Makro ändern:

#define SO_EXPAND_SIDE_EFFECTS(PATTERN) \
        ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Nach dem Login kopieren

Wenn Sie Bedenken hinsichtlich unnötiger Speicherzuweisung haben, können Sie einen benutzerdefinierten Typ definieren, der dies unterstützt Listeninitialisierung, speichert aber keine Daten:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&amp;&amp;...) {}
    };
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie rufe ich eine Funktion für alle variadischen Vorlagenargumente in C auf?. 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