一 函式物件(functor)
stl中提供了一元和二元函式的兩種functor,通過unary_function和binary_function提供了這兩種不同引數數量的functor的基本結構,在這兩個型別中,分別內嵌定義一元和二元函式操作在模版推演的時候需要用到的typedef.
//一元函式的定義為
template
struct unary_function ;
//二元函式的定義為
template
struct binary_function ;
其他的一元和二元functor可以從這兩個基本結構繼承,同時也就可以推演出函式的引數和返回值的型別,stl在上述這兩個結構的基礎上,實現了很多一元和二元的functor.
//一元
negate
//二元
plus
minus
multiplies
divides
modulus
equal_to
not_equal_to
greater
greater_equal
less
less_equal
logical_and
logical_or
logical_not
上面的這些functor都是基於模版實現的,可以象下面那樣使用的方式:
plusint_plus;
cout << int_plus(111,222) << endl;
二 函式物件介面卡
函式物件介面卡的作用就是使函式轉化為函式物件,或是將多引數的函式物件轉化為少引數的函式物件。
1)bind
bind1st //通過繫結第乙個引數,使二元的函式物件轉化為一元的函式物件
bind2nd //通過繫結第二個引數,使二元的函式物件轉化為一元的函式物件
not1 //對一元的函式物件取反
not2 //對二元的函式物件取反
使用的方式:
bind1st( less(), 10)(20);
not2( lesslv;
for(i = 0; i < 100; i++)
//對vector中小於20的數進行記數
cout << count_if(lv.begin(), lv.end(), bind2nd(less(), 20)) << endl;
//由大到小排序
sort(lv.begin(), lv.end(), not2(less()) ) ;
for (i = 0; i < 100; i++)
2)ptr_fun
ptr_fun的作用是把現有的函式轉換為函式物件.在stl中提供了這個功能的functor,就是pointer_to_unary_function和pointer_to_binary_function這兩個類,這兩個類對應一元
和二元兩種函式,也就是說,對於呼叫引數為3個或者多於3個的函式,stl提供的functor類,無法配接.
基本使用方法:
int u_func(int a)
int b_func(int a,int b)
void call()
可以看到,上面的方法改進了原先c和c++中通過函式指標來間接呼叫函式的方法,將函式指標封裝到了類中.
問題:第一部分中的functor中是自己定義操作符(),但是在ptr_fun中,是將已經有的function轉為functor呼叫就會存在乙個呼叫方式的問題.
c++中的函式,按呼叫方式可以分為__cdecl, __stdcall,__fastcall 三種,ptr_fun如何正確的識別給定的function的呼叫方式就會有問題.
其中:vc6中的stl的ptr_fun**中,統一將function認為是__cdecl呼叫方式. 而dev-cpp中使用的sgi的**中沒有明確指明函式的呼叫方式,所以將使用編譯器的確省設定.
但是如果將上面的b_func函式改為
int __stdcall b_func(int a,int b)
上面的使用**在dev-cpp中無法編譯通過.
3)mem_fun
mem_fun是將某個類中的成員函式轉變為functor的功能.
一般的使用方法
struct mem_fun_struct
int u_mem_fun(int a)
int b_mem_fun(int a,int b)
};void call()
上面的**在dev-cpp 4.9.9中編譯通過,sgi stl中沒有提供二元成員函式的mem_fun,vc6中提供了mem_fun(無引數成員函式)和mem_fun1(一元引數成員函式), 而在vs2003中改變了用法.但是我看msdn好像也只支援到乙個引數.
三 總結
stl中提供了基本的一元和二元引數的functor, 同時提供了相應的介面卡可以對functor進行修飾,functor可以很好的和 stl容器,stl演算法結合使用.
但是仍有問題:
1)上面說到的呼叫方式
2) 多引數函式物件適配
對於我們比較複雜的stl不能滿足要求的問題,我們可以是用boost或loki來解決。
四 參考
STL 函式物件
4.1函式物件 4.1.1函式物件概念 過載函式呼叫操作符的類,其物件常稱為函式物件 函式物件使用過載的 時,行為類似函式呼叫,也叫仿函式 本質 函式物件 仿函式 是乙個類,不是函式 函式物件使用 特點 函式物件在使用時,可以像普通函式那樣呼叫,可以有引數,可以有返回值 函式物件超出普通函式概念,函...
stl 仿函式 函式物件
定義 stl原始碼剖析 仿函式其實上就是乙個 行為類似函式 的物件。即主體是物件,只是使用起來像乙個函式。傳遞函式指標 templatebool compare to const t x,const t y templatevoid print compare t fun int main 傳遞的是...
STL 仿函式(函式物件)
定義 一種具有函式特徵的物件,呼叫者可以像函式一樣使用該物件,為了能夠 行為類似函式 該物件所在類必須自定義函式呼叫運算子operator 就可以在仿函式物件後面加上一對小括號,以此呼叫仿函式定義的operator 操作。class mul2 class mul3 intmain for each ...