1、先得了解使仿函数可配置的方法
我们一般使用算法如下:
class TestForeach
{
void memFun();
};
vector<TestForeach> vsSTL;
void TestFun(TestForeach a)
{}
for_each(vsSTL.begin(), vsSTL.end(), TestFun);
如果TestFun不是全局函数就会编译不过了,想要使用memFun则无法使用了。解决办法如下
class TestSTL2: public std::unary_function<TestForeach, bool>
{
public:
// 有参数的写法
bool operator()(TestForeach& left)
{
left.memFun();
return true;
}
// 另外一种没有参数的写法,可能与本章节关系不大,只是两种写法都比较特殊,在此列举
// operator后面已经指定了返回类型了
operator bool ()
{
return true;
}
}
// 上面两个函数的调用方法
TestSLT2 a;
bool b1 = a(left);
bool b2 = a; // 不能写成a()
// 按照下面方式写就可以了,重载了()的实现,刚好要的参数就是vsTest。其实成员函数最后给编译器的也是全局函数了。
for_each(vsSTL.begin(), vsSTL.end(), TestForeach2());
2、ptr_fun,mem_fun,mem_fun_ref的使用
按照如下方式就就可以了
for_each(vsSTL.begin(), vsSTL.end(), mem_fun_ref(&TestForeach::memFun));
实际上看mem_fun_ref的源码会发现,也是继承自unary_function,Ty就是类名,_Result就是返回值。
_Pmemfun是函数指针,就是传进来的memFun。最后重载()的调用return ((_Left.*_Pmemfun)());实际上就是如下调用
(*(vsTest.begin()).*&TestForeach::TestFun)();
template<class _Result,
class _Ty>
class mem_fun_ref_t
: public unary_function<_Ty, _Result>
{
explicit mem_fun_ref_t(_Result (_Ty::*_Pm)())
: _Pmemfun(_Pm)
{ // construct from pointer
}
_Result operator()(_Ty& _Left) const
{ // call function
return ((_Left.*_Pmemfun)());
}
private:
_Result (_Ty::*_Pmemfun)();// the member function pointer
}
是不是很神奇?看了好久才看懂的。