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:
(f(args), ...);
Wenn die aufgerufene Funktion jedoch möglicherweise ein Objekt mit einem überladenen Kommaoperator zurückgibt, sollten Sie Folgendes verwenden:
((void)f(args), ...);
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&&...) {} }; }
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!