N binäre Aufrufe zu einem n-stufigen Aufruf in C ++ umwandeln?

7

Wir haben eine Hilfsfunktion in unserer Codebasis, um zwei (Windows) Pfadzeichenfolgen zu verketten:

%Vor%

Es wird oft auf diese Weise verwendet:

%Vor%

Das ist eher akzeptabel, aber ich habe mich gefragt, ob es in C ++ (oder C ++ 0x) eine Möglichkeit gibt, eine (Template?) Funktion zu verwenden, um binäre Funktionsaufrufe miteinander zu verketten.

Das heißt, bei einer Funktion T f(T arg1, T arg2) ist es möglich, eine Funktion T ncall(FnT fn, T arg1, T arg2, T arg3, ...) zu schreiben, die in meinem obigen Beispiel f like aufruft und das Ergebnis zurückgibt?

%Vor%

Bitte, diese Frage bezieht sich auf die Transformation und nicht auf die beste Art und Weise, Pfadzeichenfolgen zu verarbeiten oder zu verketten!

Bearbeiten: Dank deft_code ist answer für die Bereitstellung der richtigen Bezeichnung für was ich fragte nach: Falten (Funktion höherer Ordnung) . (Beachten Sie, dass ich mich damit einverstanden erklärt habe, Die Antwort von Matthieu , weil seine Lösung C ++ 0x nicht erfordert.

    
Martin Ba 18.05.2011, 08:44
quelle

5 Antworten

13

Ohne C ++ 0x ist es auch möglich, Verkettung zu verwenden (ich empfehle nicht, den Komma-Operator zu überladen, die Syntax wird komisch).

Die Syntax ist etwas anders, aber sehr nahe:

%Vor%

Dies wird einfach dadurch erreicht, dass ein temporäres Objekt erstellt wird, das die Verkettung durch eine Überladung von operator() ausführt und die implizit durch operator CString() const konvertiert werden kann.

%Vor%

Dann optimierst du AppendPath , um ein solches Objekt zurückzugeben:

%Vor%

(Beachte, du könntest es direkt AppendPath nennen)

Es generisch nach @ Martins Vorschlag machen:

%Vor%

Code validiert auf ideone .

    
Matthieu M. 18.05.2011, 09:04
quelle
10

In C ++ 0x können Sie variadische Vorlagen verwenden. So etwas, vielleicht:

%Vor%     
R. Martinho Fernandes 18.05.2011 08:53
quelle
6

Martinho Fernandes 'Lösung allgemeiner:

%Vor%

Verwenden:

%Vor%

AppendPath könnte jedoch einfach in diesem Stil geschrieben werden:

%Vor%

Sie können diese Überladung natürlich hinzufügen und transparent in Ihrem Code verwenden.

Oder übergeben Sie eine initializer_list:

%Vor%

Code:

%Vor%

Beachten Sie, dass der letzte AppendPath mit jedem STL-ähnlichen Container funktioniert. Sie können diese Überladungen auch zu Ihrem Code hinzufügen und sie transparent verwenden.

    
Fred Nurk 18.05.2011 10:00
quelle
2

In diesem speziellen Fall von AppendPath würde ich einfach eine Überladung der Funktion schreiben, die als zweite Codezeile implementiert ist.

Im allgemeinen Fall würde ich eine Reihe von Vorlagen schreiben:

%Vor%

Was ich sicher bin, könnte leicht automatisch generiert werden.

    
quamrana 18.05.2011 09:03
quelle
1
  

Mit einer Funktion T f (T arg1, T arg2) ist es möglich, eine Funktion T ncall (FnT fn, T arg1, T arg2, T arg3, ...) zu schreiben, die wie in meinem Beispiel oben f heißt und das Ergebnis zurückgeben?

Jeder ist so nah an einer allgemeinen Falt-Implementierung. Hier ist eine noch allgemeinere Lösung als die gestellte Frage. Es akzeptiert Funktionen wie T f(T arg1, T arg2) sowie T1 f(T2 arg1, T3 arg2) . Auch habe ich die Funktion folfl als Hommage an ihre funktionalen Wurzeln benannt.

%Vor%

Ein Beispiel, wie dies Ihr Problem lösen könnte:

%Vor%

Ein weiteres Beispiel, das die ganze Stärke von foltl zeigt:

%Vor%

Siehe die Ausgabe / den Code in Aktion bei ideone .

    
deft_code 19.05.2011 21:41
quelle

Tags und Links