void dosome
( int i )
这个 dosome
是一个函数,我们可以这样来使用它: dosome(5);
那么,有什么东西可以像这样工作么?
答案 1
:重载了 () 操作符的对象,比如:struct DoSome { void
operator
()( int i );} DoSome dosome
;这里类(对 C++ 来说,
struct
和类是相同的) 重载了 () 操作符,因此它的实例 dosome 可以这
样用 dosome(5
); 和上面的函数调用一模一样,不是么?所以 dosome
就是一个仿函数了。
实际上还有答案 2:函数指针指向的对象。
typedef void
( *DoSomePtr
)( int );typedef void
( DoSome
)( int );DoSomePtr *ptr=&func;DoSome& dosome=*ptr;
dosome(5
); // 这里又和函数调用一模一样了。
当然,答案 3 成员函数指针指向的成员函数就是意料之中的答案了。
8. 仿函数的用处不管是对象还是函数指针等等,它们都是可以被作为参
数传递,或者被作为变量保存的。因此我们就可以把一个仿函数传递给一个函
数,由这个函数根据需要来调用这个仿函数(有点类似回调)。
STL
“
”
模板库中,大量使用了这种技巧,来实现库的 灵活 。
比如:for_each
, 它的源代码大致如下:template< typename
Iterator
, typename Functor > void for_each
( Iterator begin,
Iterator end
, Fucntor func )
{ for
( ; begin!=end
; begin++ )
func
( *begin );}
这个 for 循环遍历了容器中的每一个元素,对每个元素调用了仿函数
func
“
”
,这样就实现了 对 每个元素做同样的事 这样一种编程的思想。
特别的,如果仿函数是一个对象,这个对象是可以有成员变量的,这就
“
”
让 仿函数有了 状态 ,从而实现了更高的灵活性。