std::bind
Ikat argumen ke callable
std::bind adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Apa Itu std::bind
std::bind membuat objek baru yang dapat dipanggil dengan menetapkan beberapa argumen dari objek yang sudah ada. Hal ini disebut penerapan parsial.
- Tersedia dalam
<functional>. - Mengembalikan objek yang dapat dipanggil tanpa tipe yang ditentukan.
#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;
}Penanda Tempat
Penanda tempat seperti std::placeholders::_1 menandai argumen yang akan diberikan nanti saat 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;
}Mengatur Ulang Urutan Argumen
Penanda tempat dapat muncul dalam urutan apa pun, sehingga Anda dapat menukar posisi 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 dapat menetapkan beberapa argumen sekaligus dan membiarkan argumen lainnya sebagai penanda 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 dikembalikan oleh std::bind dapat disimpan dalam std::function dengan tipe konkret yang memiliki nama.
#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 Anggota
std::bind dapat menargetkan fungsi anggota dengan meneruskan penunjuk anggota dan sebuah objek (atau penanda 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 Berdasarkan Nilai vs Referensi
Argumen yang diikat disalin secara bawaan. Bungkus salah satunya dengan std::ref untuk mengikatnya berdasarkan referensi agar perubahan dapat terlihat.
#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 Terikat yang Dapat Dipanggil dalam Algoritma
Objek terikat yang dapat dipanggil dapat digunakan sebagai predikat atau operasi dalam algoritma standar.
#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;
}Menumpuk bind
Ekspresi pengikatan dapat dikomposisikan, meskipun hasilnya segera sulit dibaca. Setiap penanda tempat tetap merujuk pada 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 pemanggilan terikat hanya menggunakan beberapa penanda tempat, argumen tambahan apa pun yang diteruskan saat pemanggilan akan diabaikan begitu saja.
#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;
}Saat Lambda Lebih Jelas
C++ modern sering lebih memilih lambda daripada std::bind karena lambda lebih mudah dibaca dan dioptimalkan dengan lebih baik oleh kompiler.
#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;
}Pemeriksaan Singkat
Uji pemahaman Anda tentang penanda tempat.
Ringkasan
Anda telah mempelajari cara kerja std::bind:
- menetapkan beberapa argumen dan menggunakan penanda tempat
_1,_2untuk argumen lainnya - dapat mengatur ulang argumen, mengikat fungsi anggota, dan menggunakan
std::ref - hasilnya dapat disimpan dalam
std::functiondan digunakan dalam algoritma - lambda sering kali lebih jelas dalam C++ modern
Selanjutnya, Anda akan membandingkan lambda, bind, dan penunjuk fungsi untuk memilih alat yang tepat.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “std::bind” gratis?
Ya — teks lengkap “std::bind” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “std::bind”?
Ikat argumen ke callable Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “std::bind” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.