從函數(shù)指針到仿函數(shù)。
1.1 函數(shù)調(diào)用操作符(C++語法中的左右括號)也可以被重載。
許多STL算法都提供了兩個版本,一個用于一般狀況(例如排序時以遞增方式排列),一個用于特殊狀況(例如排序時由使用者指定以何種特殊關(guān)系進(jìn)行排列)。像這種情況,需要用戶指定某個條件或策略,而條件或策略的背后由一整組操作構(gòu)成,便需要某種特殊的東西來代表這“一整組操作”。
代表“一整組操作”的,是函數(shù)。在舊式C語言中,欲將函數(shù)當(dāng)做參數(shù)傳遞,唯有通過函數(shù)指針才能達(dá)成。例子如下:
#include <cstdlib>
#include <iostream>
using namespace std;
int fcmp(const void* elem1, const void* elem2);
int main(){
int ia[10] = {32, 97, 62, 22, 43, 25, 52, 59, 54, 9};
for (int i=0; i<10; i++)
cout << ia[i] << " ";
cout << endl;
qsort(ia, sizeof(ia)/sizeof(int), sizeof(int), fcmp);
for (int i=0; i<10; i++)
cout << ia[i] << " ";
return 0;
}
int fcmp(const void* elem1, const void* elem2){
const int* i1 = (const int*)elem1;
const int* i2 = (const int*)elem2;
if(*i1 < *i2)
return -1;
else if(*i1 == *i2)
return 0;
else if(*i1 > *i2)
return 1;
}

函數(shù)指針的缺點:無法持有自己的狀態(tài)(局部狀態(tài)),也無法達(dá)到組件技術(shù)中的可適配性——也就是無法再將某些修飾條件加諸于其上而改變其狀態(tài)。
1.2 為此,引入仿函數(shù)的概念。STL算法的特殊版本所接受的所謂“條件”或“策略”或“一整組操作”,都以仿函數(shù)形式呈現(xiàn)。
針對某個class進(jìn)行operator()重載,它就成為一個仿函數(shù)。
例子如下:
#include <iostream>
using namespace std;
// 由于將operator()重載了,因此plus成為了一個仿函數(shù)
template <class T>
struct PLUS {
T operator() (const T& x, const T& y) const {return x + y;}
};
// 由于將operator()重載了,因此minus成為了一個仿函數(shù)
template <class T>
struct MINUS {
T operator() (const T& x, const T& y) const {return x - y;}
};
int main(){
// 產(chǎn)生仿函數(shù)對象
PLUS<int> plusObj;
MINUS<int> minusObj;
// 使用仿函數(shù),就像使用一般函數(shù)一樣
cout << plusObj(3, 5) << endl;
cout << minusObj(3, 5) << endl << endl;
// 直接產(chǎn)生仿函數(shù)的臨時對象(第一對小括號),并調(diào)用(第二對小括號)
cout << PLUS<int>() (7, 6) << endl;
cout << MINUS<int>() (7, 6) << endl;
}

上述的 PLUS<T> 和 MINUS<T> 已經(jīng)非常接近STL的實現(xiàn)了,唯一的差別在于它缺乏“可適配能力”。
1.3 如果要成為一個可適配的仿函數(shù)呢?
將在讀完第8章再進(jìn)行總結(jié)。