Dalam sesetengah senario, mungkin perlu untuk menghantar Boost::function kepada kaedah yang menjangkakan standard penunjuk fungsi (menunjukkan tandatangan yang sama). Ini boleh membawa kepada ralat kompilasi.
typedef void TriggerProc_type(Variable*, void*); void InitVariable(TriggerProc_type *proc); boost::function<void (Variable*, void*)>& triggerProc ... InitVariable(triggerProc); // Error: cannot convert parameter 1
Menghapuskan Boost::function dan merujuk kepada functor terikat serta-merta membawa kepada ralat yang serupa :
error C2664: 'blah(void (__cdecl *)(type *,void *))' : cannot convert parameter 1 from 'boost::_bi::bind_t<R,F,L>>' to 'void (__cdecl *)(type *,void *)'
Penyelesaian yang diterima umum adalah terhad kerana ia hanya berfungsi dengan jayanya dalam kes remeh. Pendekatan yang lebih berkesan melibatkan penggunaan fungsi shim, yang mematuhi tandatangan panggil balik, memastikan fungsi Boost::yang berkenaan untuk memanggil dan melaksanakannya.
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);
Kaedah ini memastikan keserasian antara Boost::function dan Boost::bind, membolehkan penyepaduan lancar mereka dengan panggilan balik C. Walau bagaimanapun, jika tandatangan panggil balik tidak mempunyai penunjuk data pengguna, pendekatan ini menjadi tidak dapat dilaksanakan. Namun begitu, struktur panggil balik sebegitu sememangnya terhad dalam aplikasi praktikal dan memerlukan semakan.
Atas ialah kandungan terperinci Bagaimana untuk Melepasi Boost::function kepada Kaedah Menjangkakan Penunjuk Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!