Heim > Artikel > Backend-Entwicklung > Wie übergebe ich eine „boost::function“ sicher an einen einfachen Funktionszeiger?
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!