Heim > Backend-Entwicklung > C++ > Wie konvertiere ich eine boost::function in einen einfachen Funktionszeiger?

Wie konvertiere ich eine boost::function in einen einfachen Funktionszeiger?

Barbara Streisand
Freigeben: 2024-11-11 18:08:03
Original
981 Leute haben es durchsucht

How to Convert a boost::function to a Plain Function Pointer?

Boost::function auf einen einfachen Funktionszeiger herabstufen

Eine der häufigsten Herausforderungen beim Umgang mit boost::function ist die Notwendigkeit um es in einen einfachen Funktionszeiger umzuwandeln. Dies tritt auf, wenn mit Code interagiert wird, der einen Funktionszeiger mit einer bestimmten Signatur erwartet, während die verfügbare Funktion in boost::function gekapselt ist.

Das Problem

Bedenken Sie Folgendes Code:

typedef void TriggerProc_type(Variable*,void*);
void InitVariable(TriggerProc_type *proc);
boost::function<void (Variable*, void*)> triggerProc ...
InitVariable(triggerProc);
Nach dem Login kopieren

Die Kompilierung dieses Codes führt zu folgendem Fehler:

error C2664: 'InitVariable' : cannot convert parameter 1 from 
'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'
Nach dem Login kopieren

Die Lösung

Die vorgeschlagene Lösung hierfür Das Problem besteht darin, eine Shim-Funktion zu erstellen, die der erwarteten Callback-Signatur entspricht:

typedef void (*CallbackType)(int x, void* user_data);
void RegisterCallback(CallbackType cb, void* user_data);

void MyCallback(int x, void* userData) {
  boost::function<void(int)> pfn = static_cast<boost::function<void(int)> >(userData);
  pfn(x);
}

boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &amp;fn);
Nach dem Login kopieren

In diesem Beispiel dient MyCallback als Shim-Funktion und konvertiert die boost::function in einen kompatiblen Callback. Der Benutzerdatenparameter wird zum Speichern des boost::function-Objekts verwendet, sodass MyCallback mit einer einfachen Umwandlung darauf zugreifen und es ausführen kann.

Warum eine direkte Bindung nicht immer möglich ist

Es ist wichtig zu beachten, dass die direkte Bindung des gebundenen Funktors zwar eine Option ist, aber möglicherweise nicht immer geeignet ist. Nichttrivialer Boost::function< > Objekte erfordern normalerweise mehrere Zeiger, was die direkte Konvertierung in einen Callback im C-Stil schwierig macht.

Fazit

Durch die Verwendung einer Shim-Funktion wie MyCallback wird eine effektive Überbrückung möglich die Lücke zwischen boost::function und Callbacks im C-Stil. Dieser Ansatz ermöglicht eine nahtlose Integration und ermöglicht die Nutzung von boost::function in Szenarien, in denen einfache Funktionszeiger erforderlich sind.

Das obige ist der detaillierte Inhalt vonWie konvertiere ich eine boost::function in einen einfachen Funktionszeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage