Verwenden Sie falten Ausdrücke, um alle variadic Argumente mit newlines dazwischen zu drucken

8

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?

    
Thomas McGuire 28.03.2017, 12:49
quelle

2 Antworten

5

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.

%Vor%

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:

%Vor%

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.

Live-Beispiele .

    
Yakk 28.03.2017, 13:07
quelle
6

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:

    %Vor%
Vittorio Romeo 28.03.2017 12:57
quelle