Heim > Backend-Entwicklung > C++ > Wie übergebe ich eine Boost::function an eine Methode, die einen Funktionszeiger erwartet?

Wie übergebe ich eine Boost::function an eine Methode, die einen Funktionszeiger erwartet?

Mary-Kate Olsen
Freigeben: 2024-11-14 16:44:02
Original
474 Leute haben es durchsucht

How to Pass a Boost::function to a Method Expecting a Function Pointer?

Ableiten eines einfachen Funktionszeigers von Boost::function

In einigen Szenarien kann es notwendig sein, eine Boost::function an eine Methode zu übergeben, die einen Standard vorwegnimmt Funktionszeiger (der dieselbe Signatur demonstriert). Dies kann zu Kompilierungsfehlern führen.

Konvertierungsfehler

typedef void TriggerProc_type(Variable*, void*);
void InitVariable(TriggerProc_type *proc);
boost::function<void (Variable*, void*)>& triggerProc ...
InitVariable(triggerProc);

// Error: cannot convert parameter 1
Nach dem Login kopieren

Boost::function vermeiden

Boost::function eliminieren und auf den gebundenen Funktor verweisen, führt sofort zu analogen Fehlern :

error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter
1 from 'boost::_bi::bind_t<R,F,L>>' to 'void (__cdecl *)(type *,void *)'
Nach dem Login kopieren

Vorgeschlagene Lösung

Die allgemein akzeptierte Lösung ist begrenzt als es funktioniert nur in trivialen Fällen erfolgreich. Ein effektiverer Ansatz besteht darin, eine Shim-Funktion zu verwenden, die sich an die Callback-Signatur hält, die aufzurufende Boost::function ermittelt und ausführt.

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, &fn);
Nach dem Login kopieren

Diese Methode stellt die Kompatibilität zwischen Boost::function und sicher Boost::bind ermöglicht deren nahtlose Integration mit C-Callbacks. Wenn der Rückrufsignatur jedoch ein Benutzerdatenzeiger fehlt, ist dieser Ansatz undurchführbar. Dennoch sind solche Rückrufstrukturen in der Praxis von Natur aus begrenzt und erfordern eine Überarbeitung.

Das obige ist der detaillierte Inhalt vonWie übergebe ich eine Boost::function an eine Methode, die einen Funktionszeiger erwartet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
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