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:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
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!