仿函式(functor)的概念
仿函式(functor),就是使一個類的使用看上去象一個函式。其實現就是類中實現一個operator(),這個類就有了類似函式的行為,就是一個仿函式類了。在我們寫代碼時有時會發現有些功能的實現的代碼,會不斷的在不同的成員函式中用到,但是又不好將這些代碼獨立出來成為一個類的一個成員函式。但是又很想復用這些代碼。寫一個公共的函式,可以,這是一個解決方法,不過函式用到的一些變數,就可能成為公共的全局變數,再說為了復用這么一片代碼,就要單立出一個函式,也不是很好維護。這時就可以用仿函式了,寫一個簡單類,除了那些維護一個類的成員函式外,就只是實現一個operator(),在類實例化時,就將要用的,非參數的元素傳入類中。這樣就免去了對一些公共變數的全局化的維護了。又可以使那些代碼獨立出來,以便下次復用。而且這些仿函式,還可以用關聯,聚合,依賴的類之間的關係,與用到他們的類組合在一起,這樣有利於資源的管理(這點可能是它相對於函式最顯著的優點了)。如果在配合上模板技術和policy編程思想,那就更是威力無窮了,大家可以慢慢的體會。
仿函式(functor)在各程式語言中的套用
C
C語言使用函式指針和回調函式來實現仿函式,例如一個用來排序的函式可以這樣使用仿函式#include
/* Callback function */
int compare_ints_function(void*A,void*B)
{
return*((int*)(A))<*((int*)(B));
}
/* Declaration of C sorting function */
void sort(void*first_item,size_t item_size,void*last_item,int(*cmpfunc)(void*,void*));
int main(void)
{
int items[]={4,3,1,2};
sort((void*)(items),sizeof(int),(void*)(items +3), compare_ints_function);
return 0;
}
C++
在C++里,我們通過在一個類中 重載括弧 運算符的方法使用一個 函式對象而不是一個普通函式。class compare_class
{
public:
bool operator()(int A, int B)const{return A < B;}
};
// Declaration of C++ sorting function.
template
void sort_ints(int* begin_items, int num_items, ComparisonFunctor c);
int main()
{
int items[]={4, 3, 1, 2};
compare_class functor;
sort_ints(items, sizeof(items)/sizeof(items[0]), functor);
}
C#
C#是通過委託(delegate)來實現仿函式的。Java
Java中的仿函式是通過實現包含單個函式的接口實現的List list =Arrays.asList("10", "1", "20", "11", "21", "12");
Comparator numStringComparator =new Comparator ()
{
publicint compare(String o1, String o2){
returnInteger.valueOf(o1).compareTo(Integer.valueOf(o2));
}
};
Collections.sort(list, numStringComparator);