Heim  >  Artikel  >  Backend-Entwicklung  >  Wie rufe ich eine Funktion für alle variadischen Vorlagenargumente in C auf?

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

Susan Sarandon
Susan SarandonOriginal
2024-11-11 03:51:02252Durchsuche

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), ...);

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

((void)f(args), ...);

Pre-C 17-Lösung

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

{ print(Args)... }

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

{ (print(Args), 0)... }

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)... }

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)... }

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

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

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;...) {}
    };
}

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!

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