wie boost :: function und boost :: bind funktionieren
Mag ich nicht mit magic Boxen verstreut über meinen code...wie genau diese beiden Klassen arbeiten zu ermöglichen, grundsätzlich eine beliebige Funktion zugeordnet werden, um ein function-Objekt, auch wenn die Funktion<> hat eine ganz andere parameter die man im Vorbeigehen zu boost::bind
Es funktioniert sogar mit unterschiedlichen Aufrufkonventionen (d.h. member-Methoden sind __thiscall
unter VC, aber "normale" Funktionen sind in der Regel __cdecl
oder __stdcall
für diejenigen, die brauchen, um kompatibel zu sein mit C.
InformationsquelleAutor der Frage Fire Lancer | 2009-02-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
boost::function
erlaubt alles mit eineroperator()
mit der richtigen Unterschrift gebunden zu sein, wie die parameter und das Ergebnis Ihrer binden können, werden mit einem parameter aufgerufenint
so kann es gebunden werden, umfunction<void(int)>
.Dies ist, wie es funktioniert (diese Beschreibung gilt gleichermaßen für
std::function
):boost::bind(&klass::member, instance, 0, _1)
gibt ein Objekt wie dieseswo die
return_type
undint
abgeleitet sind, von der Unterschrift derklass::member
und die Funktion, die Zeiger und gebundene parameter sind in der Tat im Objekt gespeichert ist, aber das ist nicht wichtigNun
boost::function
nicht jede Art der überprüfung: Es wird jedes Objekt und jede Signatur, die Sie in Ihrem template-parameter, und erstellen ein Objekt, das callable nach Ihrer Unterschrift und der des Objektes aufruft. Wenn das unmöglich ist, es zu einem Kompilierfehler.boost::function
ist eigentlich ein Objekt wie dieses:wo die
return_type
undargument_type
sind entnommen ausSig
undf
dynamisch auf dem heap zugeordnet. Das ist notwendig, damit die völlig unabhängig von Objekten mit unterschiedlichen Größen bindenboost::function
.function_impl
ist nur eine abstrakte KlasseDie Klasse, die alle die Arbeit, ist eine konkrete Klasse abgeleitet
boost::function
. Es ist für jeden Typ von Objekt, das Sie zuweisenboost::function
Das bedeutet in Ihrem Fall, die Zuordnung zu boost-Funktion:
function_impl_concrete<void(int), unspecified_type>
(das ist der Kompilierung, natürlich)Beim Aufruf der Funktion Objekt, ruft die virtuelle Funktion, deren Implementierung-Objekts, die direkt den Aufruf an Ihre ursprüngliche Funktion.
DISCLAIMER: Beachten Sie, dass die Bezeichnungen in dieser Erklärung sind bewusst aus. Jede ähnlichkeit mit realen Personen oder Figuren ... Sie wissen es. Ziel war die Veranschaulichung der Prinzipien.
InformationsquelleAutor der Antwort jpalecek