Học C++ từ Cơ Bản đến Nâng Cao

Website tự học lập trình C++ miễn phí, thực chiến, dễ hiểu

Lambda & Function Object

1. Lambda Expression

Lambda là hàm ẩn danh (anonymous function), thường dùng để truyền logic nhanh gọn vào hàm khác.

      
auto add = [](int a, int b) { return a + b; };
std::cout << add(2, 3); // 5
  

Capture by Value vs Reference

Lambda có thể "nhớ" biến bên ngoài thông qua capture list.

      int x = 5;
auto f1 = [x]() { std::cout << x; };   // capture by value
auto f2 = [&x]() { std::cout << x; };  // capture by reference
  

      

mutable lambda

Dùng khi muốn sửa giá trị copy của biến captured by value.

int x = 10; auto f = [x]() mutable { x += 5; std::cout << x; }; // prints 15
📌 Lưu ý: Lambda thường dùng cho logic ngắn, không nên lạm dụng nếu logic dài hoặc cần tái sử dụng.

2. Function Object (Functor)

Là một class có operator(), giúp truyền hành vi linh hoạt và lưu được trạng thái.

      struct Adder {
  int base;
  Adder(int b) : base(b) {}
  int operator()(int x) { return base + x; }
};

Adder add5(5);
std::cout << add5(3); // 8
  
✅ Dùng functor khi cần lưu trạng thái, hoặc truyền hành vi cho template/generic code.

3. std::function

std::function<R(Args...)> là wrapper chứa lambda, functor, hoặc function pointer.

#include <functional>

std::function<int(int, int)> f;

f = [](int a, int b) { return a + b; };
f = std::plus<int>(); // functor

int add(int a, int b) { return a + b; }
f = add; // function pointer
  
🔸 Ưu điểm: linh hoạt, gói được bất kỳ callable.
⚠️ Nhược điểm: chậm hơn gọi trực tiếp (do type-erasure).

4. std::bind

std::bind tạo callable mới từ hàm gốc, có thể fix trước 1 số đối số.

#include <functional>

int add(int a, int b) { return a + b; }
auto add5 = std::bind(add, 5, std::placeholders::_1);
std::cout << add5(3); // 8
  
⚠️ Lưu ý: Với C++11 trở lên, lambda thường dễ đọc và thay thế std::bind trong nhiều trường hợp.

← Quay lại C++ Nâng Cao