Functor (function object) là đối tượng của lớp có nạp chồng operator(), cho phép gọi như hàm: obj(args). Khác với function pointer, functor có thể mang trạng thái (state) và được inline tốt hơn bởi compiler.
Ví dụ cơ bản
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
struct Square {
int operator()(int x) const { return x * x; } // functor
};
int main() {
vector<int> v = {1,2,3,4,5};
Square sq;
transform(v.begin(), v.end(), v.begin(), sq); // dùng functor
for (int x : v) cout << x << ' '; // 1 4 9 16 25
return 0;
}
Functor có trạng thái (Stateful Functor)
struct Multiplier {
int factor;
Multiplier(int f) : factor(f) {}
int operator()(int x) const { return x * factor; }
};
int main() {
vector<int> v = {1,2,3};
transform(v.begin(), v.end(), v.begin(), Multiplier(10));
// v = {10, 20, 30}
}
Functor vs Function Pointer vs Lambda
| Đặc điểm | Function Pointer | Functor | Lambda (C++11) |
|---|---|---|---|
| Cú pháp | int (*f)(int) | struct { R operator()(Args)... } | [captures](params){body} |
| Trạng thái | Không (global/static) | Có (member variable) | Có (capture) |
| Inline optimization | Khó | Dễ (type rõ ràng) | Rất tốt |
| Type | Chung cho cùng signature | Mỗi struct = type riêng | Unique closure type |
| STL algorithms | OK | OK (thường nhanh hơn) | OK (best) |