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?
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.
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.
Dann optimierst du AppendPath
, um ein solches Objekt zurückzugeben:
(Beachte, du könntest es direkt AppendPath
nennen)
Es generisch nach @ Martins Vorschlag machen:
%Vor%Code validiert auf ideone .
In C ++ 0x können Sie variadische Vorlagen verwenden. So etwas, vielleicht:
%Vor%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.
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.
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.
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 .