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

So sánh std::function và std::invoke

0 0 1

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

Theo Viblo Asia

Trong C++, cả std::functionstd::invoke đều dùng để làm việc với các đối tượng callable (hàm, lambda, functor, con trỏ hàm), nhưng chúng phục vụ hai mục đích khác nhau:

  • std::function: Lưu trữ callable để gọi sau.
  • std::invoke: Gọi callable ngay tại thời điểm sử dụng.

1. Signature là gì?

Trong C++, signature của hàm (định danh hàm) bao gồm:

  • Kiểu trả về (Return Type): Kiểu dữ liệu mà hàm trả về.
  • Kiểu tham số (Parameter Types): Kiểu dữ liệu của từng tham số hàm nhận vào.

Ví dụ:

int add(int a, int b) { return a + b;
}

Signature của hàm add() là:

  • Kiểu trả về: int
  • Kiểu tham số: (int, int)

2. std::function - Lưu trữ callable

std::function là một template class cho phép lưu trữ và gọi các callable có cùng signature.

Cách hoạt động:

  • Khi tạo std::function, ta phải xác định signature của callable.
  • Sau đó, callable nào khớp với signature đó có thể được gán vào.
  • Để gọi callable, ta dùng operator().

Ví dụ:

#include <iostream>
#include <functional> int add(int a, int b) { return a + b; }
auto multiply = [](int a, int b) { return a * b; }; int main() { std::function<int(int, int)> operation; operation = add; std::cout << "Kết quả cộng: " << operation(5, 3) << std::endl; operation = multiply; std::cout << "Kết quả nhân: " << operation(5, 3) << std::endl; return 0;
}

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

  • ✅ Khi cần lưu trữ callable để gọi sau.
  • ✅ Khi muốn truyền callable vào hàm mà không dùng template.
  • ✅ Khi cần thay đổi callable linh hoạt.

3. std::invoke - Gọi callable ngay lập tức

std::invoke là một template hàm giúp gọi callable một cách tổng quát.

Cách hoạt động:

  • Truyền vào callable và các tham số.
  • std::invoke tự động gọi callable đó.

Ví dụ:

#include <iostream>
#include <functional> int subtract(int a, int b) { return a - b; }
struct Divider { double operator()(double a, double b) const { return a / b; }
}; int main() { Divider divide; std::cout << "Kết quả trừ: " << std::invoke(subtract, 10, 4) << std::endl; std::cout << "Kết quả chia: " << std::invoke(divide, 10.0, 2.0) << std::endl; return 0;
}

Khi nào nên dùng std::invoke?

  • ✅ Khi muốn gọi callable ngay lập tức.
  • ✅ Khi viết code tổng quát (generic programming) mà không biết callable là kiểu gì.
  • ✅ Khi gọi hàm thành viên của class một cách tự động.

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