Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menghantar `boost::function` kepada C Callback Menjangkakan Penunjuk Fungsi Biasa?

Bagaimana untuk Menghantar `boost::function` kepada C Callback Menjangkakan Penunjuk Fungsi Biasa?

Susan Sarandon
Lepaskan: 2024-11-09 14:38:02
asal
775 orang telah melayarinya

How to Pass a `boost::function` to a C Callback Expecting a Plain Function Pointer?

Menurunkan Boost::function kepada Plain Function Pointer

Boost::function ialah alat serba boleh untuk mengurus penunjuk fungsi, tetapi ia boleh menjadi mencabar untuk digunakan dengan panggilan balik C yang mengharapkan penunjuk fungsi biasa. Artikel ini meneroka kerumitan isu ini dan menyediakan penyelesaian yang mantap menggunakan fungsi shim.

Masalah timbul apabila cuba menghantar rangsangan terikat::fungsi terus kepada kaedah yang mengharapkan penuding fungsi biasa dengan tandatangan yang sama . Ini mengakibatkan ralat pengkompil disebabkan oleh perbezaan dalam perwakilan penuding fungsi.

Jawapan yang diterima mencadangkan menggunakan boost::function::target() untuk mendapatkan penuding fungsi asas, tetapi pendekatan ini mempunyai had. Ia hanya berfungsi untuk kes remeh di mana rangsangan::fungsi telah dibina dengan penuding fungsi yang boleh diikat kepada panggilan balik C.

Untuk menangani isu ini, pendekatan yang lebih dipercayai ialah mencipta fungsi shim yang memenuhi tandatangan panggil balik dan menghantar panggilan ke fungsi rangsangan::yang sesuai. Ini boleh dicapai dengan menyimpan penunjuk rangsangan::fungsi sebagai data pengguna dalam fungsi panggil balik.

Berikut ialah contoh cara pendekatan ini boleh digunakan:

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

Penyelesaian ini menyediakan cara yang bersih dan boleh dipercayai untuk menggunakan boost::function and boost::bind dengan panggilan balik C, walaupun apabila tandatangan panggil balik tidak termasuk penunjuk data pengguna.

Atas ialah kandungan terperinci Bagaimana untuk Menghantar `boost::function` kepada C Callback Menjangkakan Penunjuk Fungsi Biasa?. 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