Menurunkan Boost::function kepada Plain Function Pointer
Boost::function ialah alat serba boleh untuk mengurus penunjuk fungsi, tetapi ia boleh menjadi mencabar untuk digunakan dengan panggilan balik C yang mengharapkan penunjuk fungsi biasa. Artikel ini meneroka kerumitan isu ini dan menyediakan penyelesaian yang mantap menggunakan fungsi shim.
Masalah timbul apabila cuba menghantar rangsangan terikat::fungsi terus kepada kaedah yang mengharapkan penuding fungsi biasa dengan tandatangan yang sama . Ini mengakibatkan ralat pengkompil disebabkan oleh perbezaan dalam perwakilan penuding fungsi.
Jawapan yang diterima mencadangkan menggunakan boost::function::target() untuk mendapatkan penuding fungsi asas, tetapi pendekatan ini mempunyai had. Ia hanya berfungsi untuk kes remeh di mana rangsangan::fungsi telah dibina dengan penuding fungsi yang boleh diikat kepada panggilan balik C.
Untuk menangani isu ini, pendekatan yang lebih dipercayai ialah mencipta fungsi shim yang memenuhi tandatangan panggil balik dan menghantar panggilan ke fungsi rangsangan::yang sesuai. Ini boleh dicapai dengan menyimpan penunjuk rangsangan::fungsi sebagai data pengguna dalam fungsi panggil balik.
Berikut ialah contoh cara pendekatan ini boleh digunakan:
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);
Penyelesaian ini menyediakan cara yang bersih dan boleh dipercayai untuk menggunakan boost::function and boost::bind dengan panggilan balik C, walaupun apabila tandatangan panggil balik tidak termasuk penunjuk data pengguna.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar `boost::function` kepada C Callback Menjangkakan Penunjuk Fungsi Biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!