Funktionen für variadische Vorlagenargumente aufrufen
Das Ziel besteht darin, eine print()-Funktion zu implementieren, die eine variable Anzahl von Argumenten annimmt und eine ausführt beliebige Funktion für jedes Argument. Dies ist als kompakte Alternative zur rekursiven Implementierung mit separaten Spezialisierungen für jeden Argumenttyp erwünscht.
C 17-Lösung
In C 17 kann dies mit a erreicht werden Faltausdruck:
(f(args), ...);
Dieser Ausdruck erweitert die Argumente in args und ruft für jedes einzelne f() auf. Wenn f() ein Objekt mit einem überladenen Kommaoperator zurückgibt, verwenden Sie:
((void)f(args), ...);
Lösung vor C 17
Für Versionen von C vor C 17: Ein gängiger Ansatz besteht darin, einen Listeninitialisierer zu verwenden, um die Argumente zu erweitern:
{ print(Args)... }
print() gibt jedoch void zurück, um eine Kompilierung zu vermeiden Fehler, der Code kann wie unten gezeigt geändert werden:
using expand_type = int[]; expand_type{ (print(Args), 0)... };
Dies funktioniert für verschiedene Argumente, es sind jedoch einige Einschränkungen zu beachten. Um dieses Muster wiederverwendbar zu machen, kann ein Makro erstellt werden:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), 0)... }
Um jedoch mögliche Probleme mit überladenen Kommaoperatoren zu verhindern, kann das Makro wie folgt aktualisiert werden:
#define SO_EXPAND_SIDE_EFFECTS(PATTERN) ::so::expand_type{ 0, ((PATTERN), void(), 0)... }
Pre -C 17-Lösungen erfordern möglicherweise auch zusätzliche Überlegungen, um unnötige Speicherzuweisung zu vermeiden.
Das obige ist der detaillierte Inhalt vonWie rufe ich Funktionen für variadische Vorlagenargumente in C auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!