Pengenalan:
Ekspresi Lambda menyediakan cara yang ringkas dan mudah untuk tentukan fungsi tanpa nama dalam C . Walau bagaimanapun, apabila bekerja dengan templat variadic, melepasi lambda boleh menjadi mencabar. Artikel ini meneroka teknik untuk menukar lambda generik kepada std::functions menggunakan metaprogramming templat.
Std::function Berasaskan Templat:
Untuk mendayakan penukaran lambda dengan parameter arbitrari kepada fungsi std::, kita tidak boleh bergantung pada potongan jenis templat. Sebaliknya, kami menggunakan jenis identiti untuk membalut fungsi lambda dan mengekalkan maklumat jenisnya:
template <typename T> struct identity { typedef T type; };
Menggunakan jenis identiti ini, kami mencipta fungsi generik yang menerima lambda yang dibalut sebagai hujah:
template <typename... T> void func(typename identity<std::function<void(T...)>>::type f, T... values) { f(values...); }
Contoh Penggunaan:
Walaupun pendekatan ini tidak memerlukan menyatakan parameter templat secara eksplisit, ia melibatkan menghantar argumen tambahan kepada fungsi. Berikut ialah contoh:
func([](int x, int y, int z) { std::cout << (x*y*z) << std::endl; }, 3, 6, 8);
Kesimpulan:
Walaupun penyelesaian ini menangani cabaran menukar lambda generik kepada std::fungsi dalam konteks templat variadic, ia memerlukan kelulusan hujah tambahan. Sebagai alternatif, seseorang boleh menggunakan spesifikasi parameter templat eksplisit atau mempertimbangkan pendekatan alternatif seperti menggunakan penunjuk fungsi atau pembalut objek fungsi.
Atas ialah kandungan terperinci Bagaimanakah Lambdas Generik Boleh Ditukar kepada std::functions Menggunakan Templat dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!