C++ Academy · Pelajaran

std::bind

Ikat argumen pada objek boleh panggil

Pelajaran 3 daripada 413 langkah

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, _2 untuk argumen yang selebihnya
  • boleh menyusun semula argumen, mengikat fungsi ahli dan menggunakan std::ref
  • hasilnya boleh disimpan dalam std::function dan 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.

Percuma untuk bermula

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.

Semua pelajaran dalam kursus ini

  1. Penuding Fungsi
  2. std::function
  3. std::bind
  4. Memilih Objek Boleh Panggil
← Kembali ke C++ Academy