Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menukar rangsangan::fungsi kepada Penunjuk Fungsi Biasa?

Bagaimana untuk Menukar rangsangan::fungsi kepada Penunjuk Fungsi Biasa?

Barbara Streisand
Lepaskan: 2024-11-11 18:08:03
asal
974 orang telah melayarinya

How to Convert a boost::function to a Plain Function Pointer?

Menurunkan rangsangan::fungsi kepada Penunjuk Fungsi Biasa

Salah satu cabaran biasa yang dihadapi apabila menangani rangsangan::fungsi ialah keperluan untuk menukarnya menjadi penunjuk fungsi biasa. Ini timbul apabila berinteraksi dengan kod mengharapkan penuding fungsi dengan tandatangan tertentu, manakala fungsi yang tersedia terkandung dalam boost::function.

Masalahnya

Pertimbangkan perkara berikut kod:

typedef void TriggerProc_type(Variable*,void*);
void InitVariable(TriggerProc_type *proc);
boost::function<void (Variable*, void*)> triggerProc ...
InitVariable(triggerProc);
Salin selepas log masuk

Kompilasi kod ini akan mengakibatkan ralat berikut:

error C2664: 'InitVariable' : cannot convert parameter 1 from 
'boost::function<Signature>' to 'void (__cdecl *)(type *,void *)'
Salin selepas log masuk

Penyelesaian

Penyelesaian yang dicadangkan untuk ini masalah terletak pada mencipta fungsi shim yang mematuhi tandatangan panggil balik yang dijangkakan:

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, &amp;fn);
Salin selepas log masuk

Dalam contoh ini, MyCallback berfungsi sebagai fungsi shim, menukarkan boost::function kepada panggilan balik yang serasi. Parameter data pengguna digunakan untuk menyimpan objek rangsangan::fungsi, membenarkan MyCallback mengakses dan melaksanakannya menggunakan cast mudah.

Mengapa Pengikatan Langsung Tidak Sentiasa Boleh

Adalah penting untuk ambil perhatian bahawa walaupun pengikatan terus functor terikat adalah pilihan, ia mungkin tidak selalunya sesuai. Rangsangan bukan remeh::fungsi< > objek biasanya memerlukan berbilang penuding, menjadikan penukaran terus kepada panggilan balik gaya C mencabar.

Kesimpulan

Dengan menggunakan fungsi shim seperti MyCallback, ia menjadi mungkin untuk merapatkan dengan berkesan jurang antara boost::function dan panggil balik gaya C. Pendekatan ini membolehkan penyepaduan yang lancar dan membolehkan penggunaan rangsangan::fungsi dalam senario di mana penunjuk fungsi biasa diperlukan.

Atas ialah kandungan terperinci Bagaimana untuk Menukar rangsangan::fungsi kepada Penunjuk Fungsi Biasa?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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