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
Patricia Arquetteasal
2025-01-01 03:43:09742semak imbas

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
}

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:

  1. Tukarkan Lambda kepada Fungsi Objek:
std::function<bool(int)> func = [](int i) { return i % 2 == 0; };
set<int> myNewSet = filter(mySet, func);
  1. Sediakan Argumen Jenis Templat Secara Eksplisit:
set<int> myNewSet = filter<int>(mySet, [](int i) { return i % 2 == 0; });
  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; });
  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); });

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:
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