ptr_fun,mem_fun,mem_fun_ref的使用

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

}


是不是很神奇?看了好久才看懂的。




你可能感兴趣的:(ptr_fun,mem_fun,mem_fun_ref的使用)