Rumah >pembangunan bahagian belakang >C++ >Mengapa Potongan Jenis C 11 Gagal dengan Lambdas dalam Templat Fungsi?

Mengapa Potongan Jenis C 11 Gagal dengan Lambdas dalam Templat Fungsi?

Patricia Arquette
Patricia Arquetteasal
2025-01-04 09:00:35553semak imbas

Why Does C  11 Type Deduction Fail with Lambdas in Function Templates?

Penghadan Potongan Jenis C 11 dengan Fungsi Lambda

Apabila bekerja dengan fungsi lambda dan fungsi std:: dalam C 11, potongan jenis mungkin tidak dilakukan seperti yang diharapkan, membawa kepada ralat.

The Isu

Pertimbangkan templat fungsi berikut:

template<class A>
set<A> filter(const set<A>& input, function<bool(A)> compare);

Apabila memanggil fungsi ini dengan fungsi lambda secara langsung, contohnya:

filter(mySet, [](int i) { return i % 2 == 0; });

ralat akan berlaku disebabkan oleh ketidakupayaan pengkompil untuk membuat kesimpulan jenis templat untuk A.

Penjelasan

Fungsi Lamda, sambil menyediakan sintaks yang mudah untuk fungsi tanpa nama, adalah jenis berbeza yang melaksanakan kaedah operator(). Mereka tidak disokong secara langsung oleh potongan jenis, yang menjangkakan jenis yang tepat.

Penyelesaian

Beberapa penyelesaian wujud untuk menangani isu ini:

  • Sediakan templat secara eksplisit jenis:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
  • **Buat std::fungsi:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
  • Gunakan yang diubah suai templat fungsi:
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);

Dalam templat yang diubah suai ini, jenis CompareFunction mewakili objek fungsi yang mengambil argumen A dan mengembalikan boolean. Parameter templat tidak lagi disimpulkan, tetapi dinyatakan secara eksplisit.

Ciri Tambahan

Dengan kata kunci decltype baharu dan sintaks jenis pengembalian fungsi, fungsi boleh digeneralisasikan lagi kepada menentukan jenis pulangan secara automatik:

template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { ... }

Fungsi templat ini menjangkakan tiga jenis: jenis nilai set input, perbandingan jenis fungsi, dan jenis fungsi indeks. Jenis pemulangan ditentukan secara automatik dan dibuat seketika.

Atas ialah kandungan terperinci Mengapa Potongan Jenis C 11 Gagal dengan Lambdas dalam Templat 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