Heim  >  Artikel  >  Backend-Entwicklung  >  Wie übergebe ich eine „boost::function“ an einen C-Callback und erwarte einen einfachen Funktionszeiger?

Wie übergebe ich eine „boost::function“ an einen C-Callback und erwarte einen einfachen Funktionszeiger?

Susan Sarandon
Susan SarandonOriginal
2024-11-09 14:38:02727Durchsuche

How to Pass a `boost::function` to a C Callback Expecting a Plain Function Pointer?

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!

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