Currying

Content

Lambda-Ausdrücke können auch als Ergebnis einer Funktion zurückgeliefert werden. Da der Typ unbekannt ist, geht dies nur mit auto als Return-Typ. Ebenso muss die Variable, die den Lambda-Ausdruck entgegennimmt, mit auto deklariert werden.

Es gibt in <algorithm> den Algorithmus std::find_if mit dem in einer durch Iteratoren spezifizierten Objektmenge nach einem Objekt gesucht werden kann, das ein gegebenes Prädikat erfüllt.

Angenommen, wir verwenden gerne Prädikate, die zwei Zeichenketten ohne Rücksicht auf die Klein- und Großschreibung miteinander vergleichen. Wenn das mehrfach zum Einsatz kommt, wäre eine Funktion nützlich, die eine zu suchende Zeichenkette erhält und dann ein Prädikat zurückliefert, das die zu suchende Zeichenkette mit einer anderen Zeichenkette vergleicht und dann einen entsprechenden bool-Wert zurückgibt. (Erledigen lässt sich das mit der Funktion boost::iequals aus #include <boost/algorithm/string.hpp>.)

Wenn ein Parameter in ein Funktionsobjekt verpackt wird, so dass anschließend ein Parameter weniger anzugeben ist, dann wird das als Currying bezeichnet.

Folgendes Beispiel zeigt die Anwendung:

#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/algorithm/string.hpp>

auto str_equivalence_ignore_case(const std::string& text) {
   /* FIXME */
}

int main() {
   std::vector<std::string> a = {"hello", "Hallo", "willkommen"};
   auto look_for_hello = str_equivalence_ignore_case("hallo");
   auto it = std::find_if(a.begin(), a.end(), look_for_hello);
   std::cout << "std::find_if stopped at: ";
   if (it != a.end()) {
      std::cout << "'" << *it << "'";
   } else {
      std::cout << "end";
   }
   std::cout << std::endl;
}

Fragen und Aufgabe