std::bind
Ikat argumen pada objek boleh panggil
std::bind ialah pelajaran C++ Academy percuma di CoddyKit. Ini ialah pelajaran 3 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.
Apakah std::bind?
std::bind mencipta objek boleh panggil baharu dengan menetapkan beberapa argumen bagi objek sedia ada. Proses ini dipanggil penggunaan separa.
- Ditetapkan dalam
<functional>. - Memulangkan objek boleh panggil yang jenisnya tidak dinyatakan.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
auto add10 = std::bind(add, 10, 5);
std::cout << add10() << '\n';
return 0;
}Pemegang Tempat
Pemegang tempat seperti std::placeholders::_1 menandakan argumen yang akan diberikan kemudian apabila objek terikat dipanggil.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
using namespace std::placeholders;
auto add10 = std::bind(add, 10, _1);
std::cout << add10(7) << '\n';
return 0;
}Menyusun Semula Argumen
Pemegang tempat boleh muncul dalam apa-apa susunan, lalu membolehkan anda menukar kedudukan argumen yang diberikan oleh pemanggil.
#include <iostream>
#include <functional>
int sub(int a, int b) { return a - b; }
int main() {
using namespace std::placeholders;
auto flipped = std::bind(sub, _2, _1);
std::cout << flipped(3, 10) << '\n';
return 0;
}Mengikat Beberapa Argumen
Anda boleh menetapkan beberapa argumen serentak sambil membiarkan argumen lain sebagai pemegang tempat.
#include <iostream>
#include <functional>
int volume(int l, int w, int h) { return l * w * h; }
int main() {
using namespace std::placeholders;
auto box = std::bind(volume, 2, _1, 5);
std::cout << box(3) << '\n';
return 0;
}Menyimpan Hasil
Objek yang dipulangkan oleh std::bind boleh disimpan dalam std::function untuk mendapatkan jenis yang konkrit dan dinamakan.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
using namespace std::placeholders;
std::function<int(int)> add100 = std::bind(add, 100, _1);
std::cout << add100(1) << '\n';
return 0;
}Mengikat Fungsi Ahli
std::bind boleh menyasarkan fungsi ahli dengan menghantar penuding ahli dan objek atau pemegang tempat untuk this.
#include <iostream>
#include <functional>
struct Counter {
int add(int x) { return value += x; }
int value = 0;
};
int main() {
using namespace std::placeholders;
Counter c;
auto bump = std::bind(&Counter::add, &c, _1);
std::cout << bump(5) << ' ' << bump(3) << '\n';
return 0;
}Mengikat Mengikut Nilai berbanding Rujukan
Argumen terikat disalin secara lalai. Balut salah satunya dalam std::ref untuk mengikat mengikut rujukan supaya perubahan dapat dilihat.
#include <iostream>
#include <functional>
void addTo(int& target, int amount) { target += amount; }
int main() {
using namespace std::placeholders;
int total = 0;
auto acc = std::bind(addTo, std::ref(total), _1);
acc(5);
acc(10);
std::cout << total << '\n';
return 0;
}Menggunakan Objek Boleh Panggil Terikat dalam Algoritma
Objek boleh panggil terikat boleh berfungsi sebagai predikat atau operasi dalam algoritma piawai.
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
bool greaterThan(int x, int limit) { return x > limit; }
int main() {
using namespace std::placeholders;
std::vector<int> v = {1, 5, 8, 2, 9};
auto over4 = std::bind(greaterThan, _1, 4);
std::cout << std::count_if(v.begin(), v.end(), over4) << '\n';
return 0;
}Menyarangkan bind
Ungkapan bind boleh digabungkan, walaupun hasilnya cepat menjadi sukar dibaca. Setiap pemegang tempat masih merujuk kepada argumen pemanggil akhir.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int times(int a, int b) { return a * b; }
int main() {
using namespace std::placeholders;
auto f = std::bind(add, std::bind(times, 2, _1), 3);
std::cout << f(5) << '\n';
return 0;
}Mengabaikan Argumen Tambahan
Jika panggilan terikat hanya menggunakan sesetengah pemegang tempat, apa-apa argumen tambahan yang dihantar semasa panggilan akan diabaikan begitu sahaja.
#include <iostream>
#include <functional>
int show(int a) { return a; }
int main() {
using namespace std::placeholders;
auto f = std::bind(show, _1);
std::cout << f(42, 99, 100) << '\n';
return 0;
}Apabila Fungsi Lambda Lebih Jelas
C++ moden sering mengutamakan fungsi lambda berbanding std::bind kerana fungsi lambda lebih mudah dibaca dan dioptimumkan dengan lebih baik oleh pengompil.
#include <iostream>
#include <functional>
int add(int a, int b) { return a + b; }
int main() {
auto add10 = [](int x) { return add(10, x); };
std::cout << add10(5) << '\n';
return 0;
}Semakan Pantas
Uji pemahaman anda tentang pemegang tempat.
Imbas Kembali
Anda telah mempelajari cara std::bind berfungsi:
- menetapkan beberapa argumen dan menggunakan pemegang tempat
_1,_2untuk argumen yang selebihnya - boleh menyusun semula argumen, mengikat fungsi ahli dan menggunakan
std::ref - hasilnya boleh disimpan dalam
std::functiondan digunakan dalam algoritma - fungsi lambda sering lebih jelas dalam C++ moden
Seterusnya, anda akan membandingkan fungsi lambda, bind dan penuding fungsi untuk memilih alat yang betul.
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::bind” percuma?
Ya — sebanyak 3 pelajaran dalam laluan pembelajaran C++ Academy, termasuk “std::bind”, 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::bind”?
Ikat argumen pada objek boleh panggil 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 3 daripada 4.
Berapa lamakah pelajaran “std::bind” 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.