std::function trong C++

0 0 0

Người đăng: Nguyễn Đặng Triều

Theo Viblo Asia

1. Giới thiệu về std::function

std::function là một template lớp trong C++ cho phép lưu trữ và gọi các đối tượng có thể gọi được (callable).

std::function đặc biệt hữu ích khi cần truyền các callable như tham số hoặc lưu trữ chúng để gọi lại sau này.

2. Khai báo std::function

Cú pháp khai báo std::function:

std::function<ReturnType(ArgTypes...)> name;

Trong đó:

  • ReturnType: Kiểu dữ liệu trả về của Callable.
  • ArgTypes...: Danh sách kiểu của các tham số mà Callable nhận.
  • name: Tên biến std::function.

Ví dụ

#include <iostream>
#include <functional> int add(int a, int b) { return a + b; } int main() { std::function<int(int, int)> operation = add; std::cout << "Kết quả: " << operation(3, 5) << std::endl; return 0;
}

Output:

Kết quả: 8

3. std::function với các loại Callable

3.1. Lưu trữ hàm thông thường

#include <iostream>
#include <functional> void hello() { std::cout << "Xin chào!\n"; } int main() { std::function<void()> func = hello; func(); return 0;
}

3.2. Lưu trữ lambda expression

std::function<int(int, int)> multiply = [](int a, int b) { return a * b; };
std::cout << multiply(3, 4); // Output: 12

3.3. Lưu trữ functor (đối tượng hàm)

struct Subtract { int operator()(int a, int b) { return a - b; }
}; std::function<int(int, int)> sub = Subtract();
std::cout << sub(10, 3); // Output: 7

3.4. Lưu trữ con trỏ thành viên

struct Example { int value; void print() { std::cout << "Giá trị: " << value << std::endl; }
}; Example obj{10};
std::function<void(Example&)> func = &Example::print;
func(obj); // Output: Giá trị: 10

4. Truyền std::function làm tham số

std::function có thể được sử dụng để truyền hàm như tham số.

Ví dụ

void execute(std::function<int(int, int)> func, int a, int b) { std::cout << "Kết quả: " << func(a, b) << std::endl;
} int main() { execute([](int x, int y) { return x * y; }, 5, 6); return 0;
}

Output:

Kết quả: 30

5. Khi nào nên dùng std::function?

Nên dùng khi:

  • Cần lưu trữ và gọi nhiều loại Callable khác nhau.
  • Cần truyền Callable vào hàm mà không muốn dùng template.
  • Cần thay đổi hành vi của chương trình bằng cách lưu trữ các hàm khác nhau.

Không nên dùng khi:

  • Hiệu suất là ưu tiên hàng đầu (có thể sử dụng con trỏ hàm hoặc template thay thế).
  • Callable không thay đổi (dùng con trỏ hàm trực tiếp sẽ nhanh hơn).

Bình luận

Bài viết tương tự

- vừa được xem lúc

Học lập trình game cần những gì?

Lập trình game là làm gì. Các ngôn ngữ các bạn có thể sử dụng để lập trình game : C, C++, C#, Java, Python,... Các bước cơ bản để lập trình game. . Hiển thị: Đã là game thì hiển thị không thể thiếu, lúc đầu các bạn chỉ làm cho phần hiển thị thật đơn giản, các bạn đừng quá chú tâm vào việc làm sao ch

0 0 44

- vừa được xem lúc

[MFC] Http request with winsock2.h

Giới thiệu. Xin chào, trong bài này mình sẽ giới thiệu 1 số lưu ý khi sử dụng thư viện winsock2.h (thư viện window socket) sử dụng trong window app. Đầu tiên, bạn sẽ dễ dàng search được 1 ví dụ cụ thể trên document của winsock2.

0 0 35

- vừa được xem lúc

Design parttern

Builder. 1. Ý tưởng. Builder là một mẫu thiết kế sáng tạo cho phép bạn xây dựng các đối tượng phức tạp theo từng bước.

0 0 32

- vừa được xem lúc

Kỹ thuật viết mã nguồn hiệu quả

Kỹ thuật viết mã nguồn hiệu quả? Hôm nay bài viết này mình không đề cập tới thuật toán, hãy coi như rằng chúng ta đã có thuật toán tốt nhất có thể và bây giờ chúng ta phải làm gì để có thể tăng tính hiệu quả của code. Bài viết này mình sẽ lấy ngôn ngữ lập trình C/C++ để minh họa về các hàm, các thao

0 0 38

- vừa được xem lúc

Singleton Design pattern

Singleton Design pattern. 1. Vấn đề. - Ý tưởng:.

0 0 35

- vừa được xem lúc

So sánh Python và C++

Cuộc tranh luận giữa Python và C ++ là một chủ đề hấp dẫn vì cả hai ngôn ngữ lập trình đều rất khác nhau về cú pháp, tính đơn giản, cách sử dụng và cách tiếp cận tổng thể để lập trình. Vì vậy, mọi người cảm thấy khó khăn khi lựa chọn ngôn ngữ lập trình nào để học.

0 0 40