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
Barbara Streisandasal
2024-11-11 18:08:03949semak imbas

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);

Kompilasi kod ini akan mengakibatkan ralat berikut:

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

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);

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:
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