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
Mary-Kate OlsenOriginal
2024-11-14 16:44:02467Durchsuche

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

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 *)'

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);

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!

Stellungnahme:
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