Ich mag es nicht, wenn Magic Boxes über meinen Code verteilt sind ... wie genau funktionieren diese beiden Klassen, damit grundsätzlich jede Funktion einem Funktionsobjekt zugeordnet werden kann, selbst wenn die Funktion <> einen völlig anderen Parametersatz hat als die, an die ich übergebe boost::bind
Es funktioniert sogar mit verschiedenen Aufrufkonventionen (dh Mitgliedsmethoden stehen __thiscall
unter VC, aber "normale" Funktionen sind im Allgemeinen __cdecl
oder __stdcall
für diejenigen, die mit C kompatibel sein müssen.
c++
boost
boost-bind
boost-function
Fire Lancer
quelle
quelle
Antworten:
boost::function
Ermöglichtoperator()
das Binden von Elementen mit der richtigen Signatur als Parameter, und das Ergebnis Ihrer Bindung kann mit einem Parameter aufgerufen werdenint
, sodass es an gebunden werden kannfunction<void(int)>
.So funktioniert es (diese Beschreibung gilt gleichermaßen für
std::function
):boost::bind(&klass::member, instance, 0, _1)
gibt ein Objekt wie dieses zurückwo die
return_type
undint
aus der Signatur von abgeleitetklass::member
werden und der Funktionszeiger und der gebundene Parameter tatsächlich im Objekt gespeichert sind, aber das ist nicht wichtigJetzt wird
boost::function
keine Typprüfung durchgeführt: Es werden alle Objekte und Signaturen verwendet, die Sie in ihrem Vorlagenparameter angegeben haben, und es wird ein Objekt erstellt, das gemäß Ihrer Signatur aufrufbar ist und das Objekt aufruft. Wenn dies nicht möglich ist, liegt ein Kompilierungsfehler vor.boost::function
ist eigentlich ein Objekt wie dieses:Dabei werden die
return_type
undargument_type
extrahiertSig
undf
dynamisch auf dem Heap zugewiesen. Dies ist erforderlich, damit völlig unabhängige Objekte mit unterschiedlichen Größen gebunden werden könnenboost::function
.function_impl
ist nur eine abstrakte KlasseDie Klasse, die die ganze Arbeit erledigt, ist eine konkrete Klasse, von der abgeleitet wird
boost::function
. Für jeden Objekttyp, den Sie zuweisen, gibt es einenboost::function
Das bedeutet in Ihrem Fall die Zuordnung zur Boost-Funktion:
function_impl_concrete<void(int), unspecified_type>
(das ist natürlich die Kompilierungszeit)Wenn Sie das Funktionsobjekt aufrufen, ruft es die virtuelle Funktion seines Implementierungsobjekts auf, wodurch der Aufruf an Ihre ursprüngliche Funktion geleitet wird.
HAFTUNGSAUSSCHLUSS: Beachten Sie, dass die Namen in dieser Erklärung absichtlich erfunden sind. Jede Ähnlichkeit mit realen Personen oder Charakteren ... Sie wissen es. Ziel war es, die Prinzipien zu veranschaulichen.
quelle
arg0) const=0 { return...
... das habe ich noch nie gesehen. Ich habe ein nicht funktionierendes Beispiel in einem Forum gefunden, in dem eine mit der C ++ - FAQ verknüpfte Follow-up-Nachricht erklärt, dass eine reine virtuelle Funktion einen Body haben könnte, aber ich kann keinen Code zum Kompilieren mit einer solchen Syntax (clang & gcc) erhalten.=0;
mit dem später gegebenen Körper deklariert wird (z. B.void Base::Blah() { /* ... */ }
) ... Ich frage speziell nach der oben verwendeten Notation; Ich vermute, es ist nur ein Tippfehler.