Function object trong C++

Trong C++ có một cái khá hay là Function object (đối tượng hàm) hay còn gọi là Functor.


Một Function object / Functor là một object (đối tượng) được sử dụng như một function (hàm). Một function object là instance của một class mà class đó phải có ít nhất một hàm thỏa mãn điều kiện sau

  • Là hàm thành viên có quyền truy xuất là public
  • Không phải hàm static
  • Có khai báo operator()
Ví dụ có hàm sau → đưa hàm này vào functon object thì sẽ như sau →

Instance của class testFunction là một object được gọi là Function object, được sử dụng như một function. Ví dụ:

hoặc

Khi ta gọi testFunction()(10) nghĩa là chúng ta đang gọi đến operator() của lớp testFunction.


Một Functor có thể có nhiều operator() khác nhau, dưới đây là một class có nhiều hơn một operator()

Chạy chương trình trên cho ra output như sau →

Một câu hỏi nhiều người đặt ra: TẠI SAO PHẢI DÙNG FUNCTOR LÀM GÌ ? SAO KHÔNG DÙNG LUÔN FUNCTION/FUNCTION POINTER CHO NÓ NHANH VÀ VUÔNG ?

Đầu tiên ta cần phải hiểu Function object bản chất nó là một object, do đó nó có thể lưu trạng thái (state). State ở đây có thể là state chung của tất cả các function object (của cùng class) hoặc state riêng của từng instance. Và state của Functor có thể được khởi tạo ở constructor.

Nhờ có state mà trong nhiều trường hợp chúng ta có thể giải quyết được một số trường hợp mà nếu sử dụng Function bình thường thì rất khó để code.

Một ví dụ đơn giản: Viết một hàm có thể dùng để tính tổng của nhiều số nguyên (số lượng số nguyên không biết trước) →

Kết quả:

— Phạm Minh Tuấn (Shun) —