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
Lepaskan: 2025-01-04 09:00:35
asal
513 orang telah melayarinya

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);
Salin selepas log masuk

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

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

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; });
Salin selepas log masuk
  • **Buat std::fungsi:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
Salin selepas log masuk
  • Gunakan yang diubah suai templat fungsi:
template<class A, class CompareFunction>
set<A> filter(const set<A>& input, CompareFunction compare);
Salin selepas log masuk

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> { ... }
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan