Rumah > pembangunan bahagian belakang > C++ > Mengapa Potongan Jenis Gagal dengan Fungsi Lambda dalam Templat Fungsi C?

Mengapa Potongan Jenis Gagal dengan Fungsi Lambda dalam Templat Fungsi C?

Patricia Arquette
Lepaskan: 2025-01-01 03:43:09
asal
724 orang telah melayarinya

Why Does Type Deduction Fail with Lambda Functions in C   Function Templates?

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>&amp; input, function<bool(A)> compare) {
    // Implementation omitted
}
Salin selepas log masuk

Apabila memanggil fungsi ini dengan fungsi lambda secara langsung, seperti:

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

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:

  1. Tukarkan Lambda kepada Fungsi Objek:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
Salin selepas log masuk
  1. Sediakan Argumen Jenis Templat Secara Eksplisit:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
Salin selepas log masuk
  1. Gunakan Templat Kelas:
template<class A, class CompareFunction>
set<A> filter(const set<A>&amp; input, CompareFunction compare) {
    // Implementation omitted
}

set<int> result = filter(myIntSet, [](int i) { i % 2 == 0; });
Salin selepas log masuk
  1. Gunakan Dectype dan Sintaks Jenis Fungsi:
template<class Value, class CompareType, class IndexType>
auto filter(const set<Value>&amp; 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); });
Salin selepas log masuk

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!

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