Apabila menggunakan templat C 11 atau fungsi lambda, adalah penting untuk memahami cara pemotongan jenis berfungsi. Dalam kes di mana anda menentukan templat fungsi yang menerima fungsi std::function atau lambda, pengkompil mungkin tidak dapat menyimpulkan jenis templat secara automatik.
Sebagai contoh, pertimbangkan fungsi berikut:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { set<A> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
Jika anda cuba memanggil fungsi ini terus dengan fungsi lambda, anda mungkin menghadapi ralat. Ini kerana pengkompil tidak boleh menyimpulkan jenis templat daripada fungsi lambda sahaja:
set<int> myNewSet = filter(mySet,[](int i) { return i%2==0; });
Ralat ini boleh dielakkan dengan menyatakan secara eksplisit jenis templat:
set<int> myNewSet = filter<int>(mySet,[](int i) { return i%2==0; });
Sebagai alternatif, anda boleh tukar fungsi lambda kepada objek std::function:
std::function<bool(int)> func = [](int i) { return i%2 ==0; }; set<int> myNewSet = filter(mySet,func);
Dalam kes di mana anda perlu menapis set nilai berdasarkan fungsi perbandingan, anda boleh menyediakan penyelesaian yang lebih generik dengan mencipta templat fungsi yang menerima jenis CompareFunction:
template<class Value,class CompareFunction> set<Value> filter(const set<Value>& input,CompareFunction compare) { set<Value> ret; for(auto it = input.begin(); it != input.end(); it++) { if(compare(*it)) { ret.insert(*it); } } return ret; }
Atas ialah kandungan terperinci Mengapa C 11 Tidak Menyimpulkan Jenis Apabila Menggunakan Fungsi Lambda dengan Templat Fungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!