Menurunkan Galak::fungsi kepada Penunjuk Fungsi Biasa
Masalah:
Meluluskan boost::function sebagai penunjuk fungsi biasa dengan tandatangan yang sama kepada kaedah yang memerlukan seseorang boleh mengakibatkan ralat, seperti C2664.
Penyelesaian:
Walaupun sesetengah jawapan mencadangkan menggunakan target() untuk mendapatkan penunjuk daripada fungsi boost::, ini hanya berfungsi untuk kes remeh di mana pada mulanya objek terikat layak untuk mengikat panggilan balik C.
Untuk kes bukan remeh, mekanisme asas rangsangan::fungsi memerlukan berbilang petunjuk, bukan hanya satu. Oleh itu, penyelesaian yang lebih mantap ialah mencipta fungsi shim yang mematuhi tandatangan panggil balik dan mewakilkan panggilan kepada fungsi rangsangan::yang disimpan sebagai data pengguna.
Contoh:
// 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);
Pendekatan ini membolehkan penggunaan rangsangan::fungsi dengan panggilan balik C yang termasuk data pengguna. Walau bagaimanapun, jika tandatangan panggil balik tidak mempunyai penunjuk data pengguna, ia mungkin memerlukan reka bentuk semula yang lengkap untuk menjadi boleh digunakan dalam kebanyakan keadaan.
Atas ialah kandungan terperinci Bagaimana untuk Melewati `boost::function` dengan Selamat kepada Penunjuk Fungsi Biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!