Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Melewati Fungsi C Lambda dengan Pembolehubah Ditangkap kepada Penunjuk Fungsi?

Bagaimanakah Saya Boleh Melewati Fungsi C Lambda dengan Pembolehubah Ditangkap kepada Penunjuk Fungsi?

Susan Sarandon
Susan Sarandonasal
2024-12-14 10:48:15210semak imbas

How Can I Pass C   Lambda Functions with Captured Variables to Function Pointers?

Melalukan Fungsi Lambda dengan Pembolehubah Ditangkap kepada Penunjuk Fungsi dalam C

Apabila bekerja dengan fungsi lambda dalam C , penukaran tersirat kepada penunjuk fungsi boleh ciri yang mudah. Walau bagaimanapun, lambda dengan pembolehubah yang ditangkap menimbulkan cabaran dalam hal ini, kerana ia tidak boleh ditukar secara tersirat.

Untuk menangani isu ini, kita perlu memahami batasan asas. Menangkap lambda mengekalkan salinan pembolehubah yang mereka rujuk pada titik definisi. Keadaan tertutup ini mewujudkan pergantungan pada skop, yang tidak boleh dinyatakan dalam penuding fungsi.

Penukaran eksplisit kepada penuding fungsi tidak mungkin disebabkan oleh ciri-ciri penuding yang wujud. Penunjuk mengenal pasti lokasi fungsi dalam ingatan, tetapi ia tidak boleh membawa keadaan yang diperkenalkan pembolehubah yang ditangkap.

Untuk mengatasi had ini, terdapat beberapa pendekatan:

  1. Buat Objek Fungsi: Tentukan objek fungsi seperti kelas dengan beban operator() yang merangkum pembolehubah dan logik yang ditangkap. Objek Fungsi ini kemudiannya boleh digunakan sebagai penunjuk fungsi. Walau bagaimanapun, pendekatan ini berpotensi mengorbankan beberapa sintaks lambda ringkas.
  2. Lulus sebagai Objek Fungsi: Lulus fungsi lambda sebagai Objek Fungsi dan bukannya penuding fungsi. Contohnya, kelas std::function, const stat, int)> boleh memegang lambdas dan digunakan sebagai pengganti penuding fungsi.
  3. Pembolehubah Luar Rujukan: Gunakan pembolehubah global atau statik yang boleh dirujuk oleh fungsi lambda. Pendekatan ini membenarkan komunikasi antara lambda dan skop luaran tetapi boleh memperkenalkan kebergantungan keadaan global dan isu konkurensi yang berpotensi.

Pertimbangkan contoh berikut untuk menggambarkan kelulusan lambda dengan pembolehubah yang ditangkap sebagai penunjuk fungsi menggunakan pendekatan Objek Fungsi:

#include <ftw.h>
#include <iostream>

using namespace std;

class Callback {
public:
    void operator()(const char *fpath, const struct stat *sb, int typeflag) {
        cout << fpath << endl;
    }
};

int main() {
    vector<string> entries;
    Callback callback;

    int ret = ftw("/etc", callback, 1);

    for (auto entry : entries) {
        cout << entry << endl;
    }

    return ret;
}

Dalam contoh ini, kami mencipta Panggilan Balik kelas yang melaksanakan operator panggilan fungsi() kepada meniru tingkah laku fungsi lambda. Kami kemudiannya boleh menghantar contoh kelas ini kepada fungsi ftw sebagai penuding fungsi, dengan berkesan memelihara pembolehubah yang ditangkap.

Dengan memahami batasan menukar penangkapan lambdas kepada penunjuk fungsi dan menggunakan pendekatan alternatif, pembangun boleh menggunakan dengan berkesan lambdas dalam konteks di mana penunjuk fungsi diperlukan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melewati Fungsi C Lambda dengan Pembolehubah Ditangkap kepada Penunjuk Fungsi?. 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