廣義函數對象泛指「可像函數一樣調用」的實體:
operator() 的類別實例(狹義函數對象)// 1. 一般函數
void print(int x) {
if (x >= 0 && x <= 100) cout << x << " ";
}
// 2. 函數指標
typedef void(*ptPrint)(int);
ptPrint prt = print;
// 3. 仿函數類別 (一元謂詞)
class isOk {
public:
bool operator()(int val) {
return !(val < 0 || val > 100);
}
};
vector<int> vecA = { -5, 10, 50, 150, 200 };
vector<bool> vecB(vecA.size());
// for_each: 列印 0~100 間的數
for_each(vecA.begin(), vecA.end(), print);
// transform: 判斷範圍,結果存入 vecB
transform(vecA.begin(), vecA.end(), vecB.begin(), isOk());
// vecB 對應為: false, true, true, false, false
operator()()operator()(Arg),繼承 unary_function<Arg, Result> (C++11 棄用,但概念仍在)operator()(Arg1, Arg2),繼承 binary_function<Arg1, Arg2, Result>class Grade {
public:
Grade(int id, string name, int score) : ID(id), Name(name), Score(score) {}
int ID; string Name; int Score;
};
// 依 Score 排序的二元謂詞
struct ScoreLess {
bool operator()(const Grade& a, const Grade& b) const {
return a.Score < b.Score;
}
};
// 使用
vector<Grade> grades = { {1,"A",80}, {2,"B",90}, {3,"C",70} };
sort(grades.begin(), grades.end(), ScoreLess());
文章提到的「虛函數表實現」描述不準確:函數對象調用靜態綁定(除非透過基類指標),operator() 非虛函數時無 vtable 開銷,這正是其高效能來源之一。