std::function: Boleh Dipanggil dengan Jenis Dipadam
Padamkan jenis di sebalik std::function dan fahami pengoptimuman penimbal kecil.
std::function: Boleh Dipanggil dengan Jenis Dipadam ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C++ Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Masalah: Satu Jenis untuk Banyak Objek Boleh Dipanggil
Setiap lambda mempunyai jenis unik. Setiap penuding fungsi ialah jenis yang berbeza. Kita memerlukan satu jenis yang boleh menyimpan mana-mana daripadanya — std::function.
Parameter Templat
std::function<Signature> menerima jenis pulangan dan jenis parameter. Ia menerima apa-apa yang boleh dipanggil dengan tandatangan itu.
#include <functional>
std::function<int(int, int)> op;
op = [](int a, int b) { return a + b; };
std::cout << op(3, 4); // 7Menyimpan Objek Boleh Dipanggil yang Berbeza
Pemboleh ubah std::function yang sama boleh menyimpan lambda, penuding fungsi atau funktor — selagi tandatangannya sepadan.
std::function<int(int)> f;
f = [](int x) { return x * 2; }; // lambda
f = ::abs; // function pointer
f = std::negate<int>{}; // functorPenghapusan Jenis
Secara dalaman, std::function menggunakan penghapusan jenis — ia menyimpan apa-apa objek yang boleh dipanggil dan menyembunyikan jenis sebenar di sebalik antara muka seragam. Biasanya, ini dilaksanakan dengan peruntukan kecil pada timbunan.
Kos Prestasi
Memanggil melalui std::function melibatkan panggilan tidak langsung (serupa dengan fungsi maya). Ini lebih perlahan daripada panggilan lambda secara langsung. Elakkan penggunaannya pada laluan panas.
Bila Hendak Menggunakan std::function
Gunakannya apabila:
- Menyimpan panggilan balik dalam bekas atau sebagai ahli kelas
- Mengembalikan objek boleh dipanggil daripada fungsi
- Membina pemalam atau sistem peristiwa
std::function Kosong
std::function yang dibina secara lalai adalah kosong. Memanggilnya akan melontarkan std::bad_function_call.
std::function<void()> f;
if (f) f(); else std::cout << "no callback set";Penuding Fungsi Ahli
Ikat fungsi ahli dengan std::bind atau bungkusnya dalam lambda.
struct Obj { void greet(int) {} };
Obj o;
std::function<void(int)> cb = [&](int n) { o.greet(n); };Perbandingan dengan Penuding Fungsi
Penuding fungsi tidak boleh menyimpan keadaan. std::function boleh — dengan kos panggilan tidak langsung.
Perbandingan dengan Templat
Templat dengan parameter boleh dipanggil dikhususkan pada masa kompilasi — paling pantas. std::function ditentukan pada masa jalan — lebih perlahan tetapi fleksibel.
template <typename F>
void run(F f) { f(); } // compile-time, no overhead
void run(std::function<void()> f) { f(); } // runtime, type erasurestd::function dalam C++23: std::function_ref
C++23 menambah std::function_ref — paparan tanpa pemilikan bagi objek yang boleh dipanggil. Ini mengelakkan peruntukan timbunan apabila hayatnya terbatas.
Alternatif
Alternatif ringan tersedia: std::move_only_function (C++23), tl::function_ref dan folly::Function. Pilih berdasarkan keperluan.
Semakan Pantas
Apakah kelemahan utama std::function?
Rumusan
std::function<Signature> menyimpan apa-apa objek yang boleh dipanggil dengan tandatangan yang sepadan. Berguna untuk panggilan balik, pemalam dan polimorfisme masa jalan bagi objek yang boleh dipanggil — dengan kos panggilan tidak langsung.
Pelajari C++ dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 51
- Pelajaran
- 203
Soalan Lazim
Adakah pelajaran “std::function: Boleh Dipanggil dengan Jenis Dipadam” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “std::function: Boleh Dipanggil dengan Jenis Dipadam”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus C++ Academy merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “std::function: Boleh Dipanggil dengan Jenis Dipadam”?
Padamkan jenis di sebalik std::function dan fahami pengoptimuman penimbal kecil. Anda berlatih C++ Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan C++ Academy?
Tiada pengalaman terdahulu diperlukan. Pembelajaran C++ Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.
Berapa lamakah pelajaran “std::function: Boleh Dipanggil dengan Jenis Dipadam” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- Objek Fungsi dan Functor
- Capture Lambda mengikut Nilai, Rujukan dan Mutable
- Lambda Generik dan Closure C++14
- std::function: Boleh Dipanggil dengan Jenis Dipadam