Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Melepasi Boost::function kepada Kaedah Menjangkakan Penunjuk Fungsi?

Bagaimana untuk Melepasi Boost::function kepada Kaedah Menjangkakan Penunjuk Fungsi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-14 16:44:02525semak imbas

How to Pass a Boost::function to a Method Expecting a Function Pointer?

Mendapatkan Penunjuk Fungsi Biasa daripada Boost::function

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.

Ralat Penukaran

typedef void TriggerProc_type(Variable*, void*);
void InitVariable(TriggerProc_type *proc);
boost::function<void (Variable*, void*)>& triggerProc ...
InitVariable(triggerProc);

// Error: cannot convert parameter 1

Mengelakkan Boost::function

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 *)'

Cadangan Penyelesaian

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn