Rumah > pembangunan bahagian belakang > C++ > Mengapa Potongan Jenis Templat C 11 Gagal dengan Fungsi Lambda dalam `filter()`?

Mengapa Potongan Jenis Templat C 11 Gagal dengan Fungsi Lambda dalam `filter()`?

DDD
Lepaskan: 2024-12-17 11:22:25
asal
912 orang telah melayarinya

Why Does C  11 Template Type Deduction Fail with Lambda Functions in `filter()`?

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

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

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

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

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

Sekarang, fungsi itu boleh dipanggil dengan fungsi lambda secara langsung:

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

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan