Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Melewati `boost::function` dengan Selamat kepada Penunjuk Fungsi Biasa?

Bagaimana untuk Melewati `boost::function` dengan Selamat kepada Penunjuk Fungsi Biasa?

Linda Hamilton
Linda Hamiltonasal
2024-11-10 13:19:03127semak imbas

How to Safely Pass a `boost::function` to a Plain Function Pointer?

Menurunkan Galak::fungsi kepada Penunjuk Fungsi Biasa

Masalah:

Meluluskan boost::function sebagai penunjuk fungsi biasa dengan tandatangan yang sama kepada kaedah yang memerlukan seseorang boleh mengakibatkan ralat, seperti C2664.

Penyelesaian:

Walaupun sesetengah jawapan mencadangkan menggunakan target() untuk mendapatkan penunjuk daripada fungsi boost::, ini hanya berfungsi untuk kes remeh di mana pada mulanya objek terikat layak untuk mengikat panggilan balik C.

Untuk kes bukan remeh, mekanisme asas rangsangan::fungsi memerlukan berbilang petunjuk, bukan hanya satu. Oleh itu, penyelesaian yang lebih mantap ialah mencipta fungsi shim yang mematuhi tandatangan panggil balik dan mewakilkan panggilan kepada fungsi rangsangan::yang disimpan sebagai data pengguna.

Contoh:

// Shim function for callback
typedef void (*CallbackType)(int x, void* user_data);
void MyCallback(int x, void* userData) {
    boost::function<void(int)>& pfn = static_cast<boost::function<void(int)> &>(userData);
    pfn(x);
}

// Usage
boost::function<void(int)> fn = boost::bind(myFunction(5));
RegisterCallback(MyCallback, &fn);

Pendekatan ini membolehkan penggunaan rangsangan::fungsi dengan panggilan balik C yang termasuk data pengguna. Walau bagaimanapun, jika tandatangan panggil balik tidak mempunyai penunjuk data pengguna, ia mungkin memerlukan reka bentuk semula yang lengkap untuk menjadi boleh digunakan dalam kebanyakan keadaan.

Atas ialah kandungan terperinci Bagaimana untuk Melewati `boost::function` dengan Selamat 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