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