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
Lepaskan: 2024-12-17 21:04:10
asal
453 orang telah melayarinya

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

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

Ralat ini boleh dielakkan dengan menyatakan secara eksplisit jenis templat:

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

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

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

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!

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