Boost::function zu einem einfachen Funktionszeiger herabstufen
Boost::function ist ein vielseitiges Tool zum Verwalten von Funktionszeigern, kann es aber Die Verwendung mit C-Rückrufen, die einfache Funktionszeiger erwarten, kann schwierig sein. Dieser Artikel untersucht die Komplexität dieses Problems und bietet eine robuste Lösung mithilfe einer Shim-Funktion.
Das Problem tritt auf, wenn versucht wird, eine gebundene boost::function direkt an eine Methode zu übergeben, die einen einfachen Funktionszeiger mit derselben Signatur erwartet . Dies führt aufgrund der unterschiedlichen Funktionszeigerdarstellungen zu Compilerfehlern.
Die akzeptierte Antwort schlägt vor, boost::function::target() zu verwenden, um den zugrunde liegenden Funktionszeiger abzurufen, dieser Ansatz weist jedoch Einschränkungen auf. Dies funktioniert nur in trivialen Fällen, in denen die boost::function mit einem Funktionszeiger erstellt wurde, der an einen C-Callback gebunden werden kann.
Um dieses Problem zu beheben, besteht ein zuverlässigerer Ansatz darin, eine Shim-Funktion zu erstellen, die erfüllt die Rückrufsignatur und leitet Aufrufe an die entsprechende boost::function weiter. Dies kann erreicht werden, indem der boost::function-Zeiger als Benutzerdaten in der Callback-Funktion gespeichert wird.
Hier ist ein Beispiel, wie dieser Ansatz verwendet werden kann:
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 Lösung bietet eine saubere und zuverlässige Möglichkeit, boost::function und boost::bind mit C-Callbacks zu verwenden, auch wenn die Callback-Signaturen keine Benutzerdatenzeiger enthalten.
Das obige ist der detaillierte Inhalt vonWie übergebe ich eine „boost::function' an einen C-Callback und erwarte einen einfachen Funktionszeiger?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!