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
Lepaskan: 2024-11-14 16:44:02
asal
460 orang telah melayarinya

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
Salin selepas log masuk

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 *)'
Salin selepas log masuk

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);
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan