Das klassische Beispiel für C ++ 17-fache Ausdrücke ist das Drucken aller Argumente:
%Vor%Beispiel:
%Vor%Ausgabe:
%Vor%Ich möchte meiner Ausgabe Zeilenumbrüche hinzufügen. Allerdings kann ich keinen guten Weg finden, das zu tun, das Beste, was ich bisher gefunden habe:
%Vor% Dies ist jedoch kein Null-Overhead, da es für jedes Argument ein temporäres ostringstream
erstellt.
Die folgenden Versionen funktionieren auch nicht:
%Vor%Und
%Vor%Ich verstehe, warum die letzten beiden Versionen nicht funktionieren. Gibt es eine elegantere Lösung für dieses Problem mithilfe von Faltungsausdrücken?
repeat
nimmt ein Funktionsobjekt f
und gibt ein neues Funktionsobjekt zurück. Der Rückgabewert läuft auf jedem seiner Argumente. Es "wiederholt" f
auf jedem seiner Argumente.
Verwenden:
%Vor% Dies verwendet Faltungsausdrücke, aber nur indirekt. Und ehrlich, du hättest das in C ++ 14 schreiben können (nur der Körper von repeat
wäre hässlicher).
Wir könnten auch einen Streamer schreiben, der mit <<
arbeitet, um es "mehr inline" zu machen und falte Ausdrücke direkt zu benutzen:
Dann benutzen wir es so:
%Vor% ostreamer
verwendet ein Funktionsobjekt. Es gibt ein Objekt zurück, das <<
so überlädt, dass, wenn Sie links einen Ostream übergeben, das Funktionsobjekt mit dem Ostream aufgerufen wird.
Es wird kein temporärer Stream erstellt.
Update: T.C. 's Kommentar lieferte eine bessere Lösung:
%Vor%Sie können einen falten Ausdruck über den Komma Operator verwenden:
%Vor%Verwendung:
%Vor%a
1
1000
(Hinweis: Dies druckt auch einen abschließenden Zeilenumbruch.)
Erläuterung:
[](const auto& x){ cout << x << "\n"; }
ist ein Lambda, das bei x
% x
und '\n'
angibt.
[](const auto& x){ cout << x << "\n"; }(args)
ruft sofort das Lambda mit args
auf.
([](const auto& x){ cout << x << "\n"; }(args), ...)
ist ein Faltungsausdruck über den Kommaoperator , der folgendermaßen erweitert wird:
Tags und Links c++ variadic-templates c++17 fold-expression