Penghadan Potongan Jenis C 11 dengan Fungsi Lambda
C 11 membenarkan potongan jenis templat, tetapi terdapat had apabila lambda berfungsi atau std: :fungsi terlibat. Apabila menggunakan fungsi dengan parameter templat, pengkompil selalunya boleh menyimpulkan jenis templat daripada jenis hujah. Walau bagaimanapun, potongan ini gagal apabila menggunakan lambdas secara langsung dalam hujah.
Pernyataan Masalah
Kod berikut gagal untuk menyimpulkan jenis templat untuk penapis fungsi():
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // ... }
Apabila memanggil fungsi ini terus dengan fungsi lambda sebagai hujah bandingkan, pengkompil menimbulkan ralat:
filter(mySet, [](int i) { return i % 2 == 0; }); // Throws an error
Sebab Ralat
Punca ralat ini terletak pada sifat fungsi lambda. Walaupun mereka berkelakuan seperti objek fungsi, mereka bukan fungsi sebenar. Fungsi Lambda tidak ditukar secara tersirat kepada objek std::function, yang membolehkan pengkompil menyimpulkan jenis.
Penyelesaian
Beberapa penyelesaian wujud untuk menyelesaikan isu potongan :
1. Argumen Templat Eksplisit:
Nyatakan hujah templat secara eksplisit:
filter<int>(mySet, [](int i) { return i % 2 == 0; });
2. Cipta objek std::function:
Tukar fungsi lambda kepada objek std::function dan hantarkannya sebagai parameter:
std::function<bool(int)> compare = [](int i) { return i % 2 == 0; }; filter(mySet, compare);
3. Gunakan Definisi Fungsi Alternatif:
Takrifkan semula fungsi penapis() untuk menerima objek fungsi perbandingan umum:
template<class Value, class CompareType> set<Value> filter(const set<Value>& input, CompareType compare) { // ... }
Sekarang, fungsi itu boleh dipanggil dengan fungsi lambda secara langsung:
filter(mySet, [](int i) { return i % 2 == 0; });
Kesimpulan
Lambda fungsi menyediakan cara yang mudah untuk menentukan fungsi jangka pendek, tetapi ia boleh memperkenalkan kerumitan mengenai potongan jenis templat. Dengan memahami batasan dan menggunakan penyelesaian yang sesuai, pembangun boleh memanfaatkan lambda dalam kod C 11 dengan berkesan.
Atas ialah kandungan terperinci Mengapa Potongan Jenis Templat C 11 Gagal dengan Fungsi Lambda dalam `filter()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!