Rumah >pembangunan bahagian belakang >C++ >Mengapa C 11 Tidak Menyimpulkan Jenis Apabila Menggunakan Fungsi Lambda dengan Templat Fungsi?

Mengapa C 11 Tidak Menyimpulkan Jenis Apabila Menggunakan Fungsi Lambda dengan Templat Fungsi?

Susan Sarandon
Susan Sarandonasal
2024-12-17 21:04:10450semak imbas

Why Doesn't C  11 Deduce Types When Using Lambda Functions with Function Templates?

C 11 Tidak Menyimpulkan Jenis Apabila Fungsi atau Fungsi Lambda Dilibatkan

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!

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