Heim >Backend-Entwicklung >C++ >Wie übergebe ich eine Boost::function an eine Methode, die einen Funktionszeiger erwartet?
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.
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 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 *)'
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!