Ich versuch es dir spaßeshalber ein bisschen näher zu bringen.
Dazu muss man sich bewusst werden wie Funktionen bei C oder C++ im Speicher liegen. Zum einen gibt es Funktionen die außerhalb einer Klasse sind. Das sind ganz normale C Funktionen die irgendwo im Speicher liegen. Darauf einen Funktionspointer zu machen ist sehr einfach, weil man muss wirklich nur wissen: Wo liegt die Funktion. Da kommen wir aber schon zum ersten Problem. Normalerweise prüft der Compiler: Passen die Argumente die du angibst zu der Funktion. Bei Funktionspointer kannst du das umgehen wenn du willst.
Dazu auch noch eine nette Anmerkung: Man kann auch spaßeshalber hingehen und den Speicher in dem eine Funktion liegt durch eine andere Funktion zur Laufzeit überschreiben. Wenn man dann die ursprüngliche aufruft ruft man in wirklichkeit die überschriebene auf .
Aber nun der eigentliche Grund für std::function. Die zweite Art von Funktion die wir in C++ haben können sind Klassenfunktionen (Die man dann eigentlich Methoden nennt). Wenn wir jetzt eine Klasse A haben:
Code:
class A
{
public:
int a;
void do_something_on_a(){a++;}
};
Dann stellen wir fest es gibt zum einen Daten in einer Klasse, zum anderen Funktionen die auf den Daten arbeiten. Der Compiler geht hin und legt für jede Klasse einmal Speicher an in dem die ganzen Funktionen liegen. Die Daten werden jetzt aber für jede Instanz getrennt angelegt. D.h. jedes mal wenn wir A* neueInstanz = new A() machen. Wird Speicher für die Variable a reserviert. Wenn wir jetzt neueInstanz->do_something_on_a() aufrufen. Dann baut der Compiler eigentlich einen Aufruf zusammen in dem er die Funktion do_something_on_a() mit der entsprechenden Instanz aufruft.
Wenn du jetzt aber versuchst einen Funktionspointer auf do_something_on_a zu erstellen würde der ja in C-Style Syntax so aussehen: (Wenn ich nen Syntaxfehler drin hab kann sein. Bin was C-Style Funktionspointer anbelangt nicht so fit was die Syntax angeht)
Das Problem dabei ist aber: Da ist nicht die Instanz mit eingebaut auf der die Methoden arbeiten soll. Man kann das zwar mit integrieren. Bringt aber weitere Probleme mit sich nämlich z.B. dass unterschiedliche Compiler funktionen unterschiedlich aufrufen. D.h. der Code ist plötzlich nicht mehr auf einer anderen Plattform lauffähig. (Und man kann die Typenprüfung umgehen wenn man will) (Das exakte kann man hier nachlesen: http://www.newty.de/fpt/fpt.html#defi)
Deshalb hat C++11 das std::function template mitgebracht. Damit kann man Plattformunabhängig Pointer auf Memberfunktionen erstellen und aufrufen und die Syntax ist viel netter.
Lesezeichen