boost::function
Ermöglicht operator()
das Binden von Elementen mit der richtigen Signatur als Parameter, und das Ergebnis Ihrer Bindung kann mit einem Parameter aufgerufen werden int
, sodass es an gebunden werden kann function<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ück
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return instance->*&klass::member(0, i);
}
wo die return_type
und int
aus der Signatur von abgeleitet klass::member
werden und der Funktionszeiger und der gebundene Parameter tatsächlich im Objekt gespeichert sind, aber das ist nicht wichtig
Jetzt 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:
template <class Sig>
class function
{
function_impl<Sig>* f;
public:
return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};
Dabei werden die return_type
und argument_type
extrahiert Sig
und f
dynamisch auf dem Heap zugewiesen. Dies ist erforderlich, damit völlig unabhängige Objekte mit unterschiedlichen Größen gebunden werden können boost::function
.
function_impl
ist nur eine abstrakte Klasse
template <class Sig>
class function_impl
{
public:
virtual return_type operator()(argument_type arg0) const=0;
};
Die 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
template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
Object o
public:
virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};
Das bedeutet in Ihrem Fall die Zuordnung zur Boost-Funktion:
- instanziiert einen Typ
function_impl_concrete<void(int), unspecified_type>
(das ist natürlich die Kompilierungszeit)
- Erstellt ein neues Objekt dieses Typs auf dem Heap
- weist dieses Objekt dem f-Mitglied von boost :: function zu
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.