Aufrufen einer Funktion für variadische Vorlagenargumente
In C möchte man möglicherweise eine Funktion entwerfen, die nahtlos mit einer beliebigen Anzahl von Argumenten arbeiten kann Argumente verschiedener Art. Die rekursive Vorlagenspezialisierung ermöglicht zwar eine solche Funktionalität, erzeugt jedoch eine beträchtliche Menge an redundantem Code. Um dieses Problem anzugehen, wird nach einem effizienteren Ansatz gesucht.
C 17 Fold Expression Solution
In C 17 wird eine einfache Lösung durch den Fold Expression bereitgestellt:
(f(args), ...);
Dieser Ausdruck ermöglicht den sequentiellen Aufruf von f für jedes Argument im args variadic Pack. Wenn f jedoch ein Objekt mit einem überladenen Kommaoperator zurückgibt, sollte die folgende Syntax verwendet werden:
((void)f(args), ...);
Lösung vor C 17
Vor C 17 , ein typischer Ansatz bestand darin, einen Listeninitialisierer mit einem absichtlich nicht leeren Rückgabetyp zu verwenden:
{ print(Args)... }
Dies erfordert jedoch einen Wrapping der Ausdruck in einer nicht verwendeten Variablen, um Kompilierungsfehler aufgrund des void-Rückgabetyps des Drucks zu verhindern:
using expand_type = int[]; expand_type{ (print(Args), 0)... };
Um die Wiederverwendbarkeit dieses Musters zu verbessern, kann ein Makro definiert werden:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... } SO_EXPAND_SIDE_EFFECTS(print(Args));
Um die potenzielle Zuweisung großer Arrays zu verringern, kann eine benutzerdefinierte Struktur verwendet werden:
namespace so { struct expand_type { template <typename... T> expand_type(T&&...) {} }; }
Das obige ist der detaillierte Inhalt vonWie ruft man in C eine Funktion für verschiedene Vorlagenargumente auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!