Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Hàm bind và placeholder trong C++

Chúng ta sẽ xem hàm bind và placeholder trong C++. Đôi khi cần thao tác hoạt động của một số hàm theo ý muốn. Ta có thể dùng tham số mặc định để có phần nào thao tác được.

Trong C++11, tính năng mới là hàm bind. Điều này giúp thao tác dễ dàng hơn. Để dùng tính năng này, cần include <functional>.

Hàm bind với placeholder giúp xác định vị trí và số lượng đối số để sửa đổi hàm theo đầu ra mong muốn.

Placeholder là namespace xác định vị trí giá trị trong hàm. Placeholder được ký hiệu bằng _1, _2, _3, v.v.

Ví dụ

#include <functional>
#include <iostream>

struct Foo {
  Foo(int num) : num_(num) {}
  void print_add(int i) const { std::cout << num_ + i << '\n'; }
  int num_;
};

void print_num(int i) {
  std::cout << i << '\n';
}

struct PrintNum {
  void operator()(int i) const {
    std::cout << i << '\n';
  }
};

int main() {
  std::function<void(int)> f_display = print_num;
  f_display(-9);
  std::function<void()> f_display_42 = []() { print_num(42); };
  f_display_42();
  std::function<void()> f_display_31337 = std::bind(print_num, 31337);
  f_display_31337();
  std::function<void(const Foo&, int)> f_add_display = &Foo::print_add;
  const Foo foo(314159);
  f_add_display(foo, 1);
  std::function<int(Foo const&)> f_num = &Foo::num_;
  std::cout << "num_: " << f_num(foo) << '\n';
  using std::placeholders::_1;
  std::function<void(int)> f_add_display2 = std::bind(&Foo::print_add, foo, _1);
  f_add_display2(2);
  std::function<void(int)> f_add_display3 = std::bind(&Foo::print_add, &foo, _1);
  f_add_display3(3);
  std::function<void(int)> f_display_obj = PrintNum();
  f_display_obj(18);
}

Kết quả

-9
42
31337
314160
num_: 314159
314161
314162
18