定義(stl源碼剖析):
仿函數其實上就是一個"行爲類似函數"的對象。
即主體是對象,只是使用起來像一個函數。
傳遞函數指針:
template<typename T>
bool compare_to(const T& x, const T &y) { return x > y;}
template<typename T>
void print_compare(T fun) {
std::cout << fun(3, 5) << std::endl;
}
int main() {
print_compare(compare_to<int>);
return 0;
}
傳遞的是一個函數指針
傳遞仿函數:
template<typename T>
struct CompareTo : public std::binary_function<T, T, bool> {
bool operator() (const T& x, const T &y) const { return x > y;}
public:
CompareTo() {}
};
template<typename T>
void print_compare(T fun) {
std::cout << fun(3, 5) << std::endl;
}
int main() {
print_compare(CompareTo<int>());
return 0;
}
這樣能看出來CompareTo的傳入像是一個函數調用一樣。
實際上並不是如此,其上面的函數指針傳入邏輯是不一樣的,
函數指針:傳入的函數的地址,因此是直接調用函數
仿函數:實際是傳入的是臨時創建的CompareTo的臨時變量,Compare<int>()調用的是構造函數,因此傳入的是對象
後面的調用在print_compare的調用實際是調用CompareTo的operator()的函數,因此仿函數是行爲看起來更像傳入函數調用的對象