„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie rufe ich eine Funktion für alle Variadic-Vorlagenargumente in C++ auf?

Wie rufe ich eine Funktion für alle Variadic-Vorlagenargumente in C++ auf?

Veröffentlicht am 19.11.2024
Durchsuche:343

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 oft 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 zurückgibt mit einem überladenen Kommaoperator sollten Sie Folgendes verwenden:

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

Pre-C 17 Lösung

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

{ print(Args)... }

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

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

zurückgeben, um sicherzustellen, dass dies mit einer beliebigen Anzahl von funktioniert Argumente können Sie dafür sorgen, dass das Paket immer mindestens ein Element enthält:

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

Sie können dieses Muster in ein wiederverwendbares Makro kapseln :

namespace so {
    using expand_type = int[];
}

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

Um überladene Kommaoperatoren zu verarbeiten, 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 Listen unterstützt. Initialisierung, speichert aber keine Daten:

namespace so {
    struct expand_type {
        template <typename... T>
        expand_type(T&&...) {}
    };
}
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3