Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menukar Lambdas kepada `std::function` dalam C Tanpa Menentukan Parameter Templat Secara Eksplisit?

Bagaimanakah Saya Boleh Menukar Lambdas kepada `std::function` dalam C Tanpa Menentukan Parameter Templat Secara Eksplisit?

Susan Sarandon
Susan Sarandonasal
2024-12-04 12:58:09841semak imbas

How Can I Convert Lambdas to `std::function` in C   Without Explicitly Specifying Template Parameters?

Menukar Lambdas kepada std::function dengan Templat

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:

  • Ia memerlukan lulus tambahan hujah kepada fungsi, yang mungkin tidak diingini dalam semua senario.
  • Ia tidak boleh mengendalikan kes di mana lambda menangkap pembolehubah daripada skop sekeliling.

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!

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