Dalam C , menukar lambda kepada std::function tanpa menyatakan parameter templat secara eksplisit memberikan cabaran. Mari kita terokai masalah dan penyelesaiannya.
Memahami Isu
Apabila mentakrifkan fungsi std::tanpa menentukan parameter templat, pengkompil tidak boleh menyimpulkan jenis lambda hujah. Ini kerana jenis lambda bergantung pada jenis parameternya, yang tidak diketahui oleh pengkompil pada masa instantiasi templat.
Penyelesaian: Jenis Identiti
Untuk memintas isu ini, kami boleh membungkus lambda dalam jenis identiti, yang mengabaikan jenis bergantung semasa potongan jenis templat. Berikut ialah contoh:
template <typename T> struct identity { typedef T type; }; template <typename... T> void func(typename identity<std::function<void(T...)>>::type f, T... values) { f(values...); }
Pendekatan ini membolehkan kami menghantar lambda kepada fungsi func() tanpa menyatakan parameter templat secara eksplisit.
Penghadan
Penyelesaian ini, walau bagaimanapun, mempunyai had:
Pendekatan Alternatif
Jika lambda tidak menangkap pembolehubah dan anda sanggup melakukannya secara eksplisit nyatakan parameter templat, anda boleh menggunakan pendekatan berikut:
std::function<void()> f = [](int x, int y, int z) { std::cout << (x*y*z) << std::endl; };
Kaedah ini lebih mudah dan berfungsi dengan baik apabila parameter templat diketahui pada masa penyusunan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menukar Lambdas kepada `std::function` dalam C Tanpa Menentukan Parameter Templat Secara Eksplisit?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!