Jenis Potongan Perangkap dengan Fungsi Lambda
Dalam C , jenis potongan ialah ciri berkuasa yang membolehkan pengkompil membuat kesimpulan jenis pembolehubah dan ungkapan. Walau bagaimanapun, ia boleh menghadapi cabaran apabila berurusan dengan fungsi lambda dan objek std::function.
Pertimbangkan templat fungsi berikut:
template<class A> set<A> filter(const set<A>& input, function<bool(A)> compare) { // Implementation omitted }
Apabila memanggil fungsi ini dengan fungsi lambda secara langsung, seperti:
filter(mySet, [](int i) { return i % 2 == 0; });
anda mungkin menghadapi ralat yang menyatakan bahawa tiada fungsi padanan untuk panggilan tersebut. Ini berlaku kerana potongan jenis tidak boleh mengendalikan fungsi lambda sebagai hujah langsung kepada std::function.
Sebabnya ialah fungsi lambda tidak dianggap sebagai fungsi dalam erti kata yang ketat, sebaliknya berfungsi objek dengan spesifik set ciri. Piawaian membenarkan lambdas ditukar kepada objek std::function dengan jenis parameter eksplisit dan, dalam kes tertentu, penunjuk fungsi. Walau bagaimanapun, ini tidak menaikkannya ke tahap yang sama seperti std::function.
Untuk memintas pengehadan ini, terdapat beberapa pendekatan yang boleh anda ambil:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; }; set<int> myNewSet = filter(mySet, func);
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
template<class A, class CompareFunction> set<A> filter(const set<A>& input, CompareFunction compare) { // Implementation omitted } set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
template<class Value, class CompareType, class IndexType> auto filter(const set<Value>& input, CompareType compare, IndexType index) -> map<decltype(index(*(input.begin()))), Value> { // Implementation omitted } map<string, int> s = filter(myIntSet, [](int i) { return i % 2 == 0; }, [](int i) { return toString(i); });
Dengan menggunakan strategi ini, anda boleh berjaya menggunakan fungsi lambda dan objek std::function sambil mengambil kira had potongan jenis C .
Atas ialah kandungan terperinci Mengapa Potongan Jenis Gagal dengan Fungsi Lambda dalam Templat Fungsi C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!