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

Wie übergebe ich eine „boost::function“ sicher an einen einfachen Funktionszeiger?

Linda Hamilton
Linda HamiltonOriginal
2024-11-10 13:19:03128Durchsuche

How to Safely Pass a `boost::function` to a Plain Function Pointer?

Boost::function auf einen einfachen Funktionszeiger herabstufen

Problem:

Übergabe von a boost::function als einfacher Funktionszeiger mit derselben Signatur auf eine Methode, die eine erfordert, kann zu Fehlern führen, z C2664.

Lösung:

Während einige Antworten vorschlagen, target() zu verwenden, um einen Zeiger aus einer boost::function abzurufen, funktioniert dies nur in trivialen Fällen, in denen der anfängliche Das gebundene Objekt war für die Bindung an einen C-Rückruf geeignet.

In nicht trivialen Fällen erfordert der zugrunde liegende Mechanismus einer boost::function mehrere Hinweise, nicht nur einer. Daher besteht eine robustere Lösung darin, eine Shim-Funktion zu erstellen, die der Rückrufsignatur entspricht und den Aufruf an die als Benutzerdaten gespeicherte boost::function delegiert.

Beispiel:

// Shim function for callback
typedef void (*CallbackType)(int x, void* user_data);
void MyCallback(int x, void* userData) {
    boost::function<void(int)>& pfn = static_cast<boost::function<void(int)> &>(userData);
    pfn(x);
}

// Usage
boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);

Dieser Ansatz ermöglicht die Verwendung von boost::function mit C-Callbacks, die Benutzerdaten enthalten. Wenn der Rückrufsignatur jedoch ein Benutzerdatenzeiger fehlt, kann in den meisten Fällen eine vollständige Neugestaltung erforderlich sein, damit sie verwendbar ist.

Das obige ist der detaillierte Inhalt vonWie übergebe ich eine „boost::function“ sicher an 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