stl 仿函數(函數對象)

定義(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()的函數,因此仿函數是行爲看起來更像傳入函數調用的對象


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章