Giới thiệu
Function objects được hiện thực để sử dụng như một hàm, và có thể dùng như một kiểu dữ liệu (vì bản chất là đối tượng).
Đối tượng hướng đến
Thông thạo lập trình hướng đối tượng với ngôn ngữ C++. Ngoài ra cần biết thêm kiến thức về con trỏ hàm để dễ tiếp cận bài viết này, đọc thêm Con Trỏ Hàm Trong C/C++.
Function Objects là gì?
Function Objects hay còn được biết là Functor, mục tiêu của chúng ta là có thể dùng tên class xem như lời gọi hàm. Tức là với Function Objects ta sẽ có 2 điều sau: dùng như 1 kiểu dữ liệu, hoặc có thể xem như tên hàm để gọi. Xem xét đoạn codes bên dưới để hiểu rõ hơn.
SAddition add_obj; // Use as data type add_obj.set(10); // Use as function - 10+15 int result = add_obj(10, 15);
Như codes trên ta thấy, đối tượng add_obj có thể sử dụng như một đối tượng, hoặc có thể gọi hàm, vậy phần việc còn lại của chúng ta là, khi ta gọi như gọi hàm, thì chúng ta phải hiện thực hàm này ra sao?
operator()
Để có thể gọi được add_obj() ta đơn giản hiện thực lại operator() trong class SAddition.
class SAddition { public: int operator()(int a, int b) { return a + b; } }; int main() { SAddition add_obj; // Original way add_obj.operator()(10, 15); // Short way add_obj(10, 15); return 0; }
Ta hiện thực lại operator() với 2 tham số vào là a và b. Khi tiến hành gọi hàm, ta có thể gọi theo cách truyền thống là đối tượng - chấm - phương thức (add_obj.operator()(10, 15). Hoặc, đạt tới điều cuối cùng mà ta đang thảo luận, gọi như một hàm add_obj(10, 15) là 2 cách gọi tương đương nhau.
Lợi ích
Lợi ích của việc sử dụng Functor thay vì các hàm khác là hiện thực các hàm và các hàm này có thể lưu trạng thái (trong các thuộc tính của lớp), ta có thể truyền đối tượng vào một hàm khác bao gồm cả các thuộc tính cần thiết thông qua đối tượng và đặc tính này con trỏ hàm không có.