boost::mem_fn 从成员函数指针到函数对象

boost::mem_fn 从成员函数指针到函数对象

    C++通过范型编程倒是映入了大量函数编程的思想和手法,但终究强类型的语言,有时代码就不是那么优雅了.
    一般情况下函数指针和函数对象(functor)是可以互换的,如std::for_each的第三个参数,但标准库中有4个函数配接器(not1,not2,bind1st,bind2nd)是不能接受函数指针,必须使用std::ptr_fun将函数指针封装成函数对象.还有一种情况是函数指针指向的函数的参数类型与函数模板需要的不匹配,如果要通过for_each调用每个Iterator的解引用(dereference)的对象的某个成员函数.直接使用诸如ClassA::*member_func的成员函数指针显然是想当然的做法,调用的语法都不一致,结果是一大堆编译错误信息.没有关系可以使用std::mem_fun和std::mem_fun_ref.如for_each(classAVector.begin(),classAVector.end(),mem_fun_ref(ClassA::*member_func)).标准库中的这一套函数适配器(functor adapters)使用起来要充分考虑使用的场合.不同的情况使用不同配接器.特别是您要区分for_each的容器是Container<T>还是Container<T*>,前者使用std::mem_fun_ref,后者使用std::mem_fun.这一段的详细讨论可一参照Effective STL的第40条和第41条.(个人感觉这几个配接器的名字真有的...fun).
    如果您实在是有点受不了或者你不能确定容器中究竟放的是什么而且你愿意使用一下准标准库,就可以考虑boost库的mem_fn.boost::mem_fn也不是很特别的boost成员.使用boost::mem_fn好处:不用关心容器中是T还是T*甚至是boost::share_ptr<T>,另外买一赠一fn比fun更好听一点.下面抄录boost的帮助代码就很说明问题了.
struct X
{
    
void  f();
};

void  g(std::vector < X >   &  v)
{
    std::for_each(v.begin(), v.end(), boost::mem_fn(
& X::f));
};

void  h(std::vector < *>   const   &  v)
{
    std::for_each(v.begin(), v.end(), boost::mem_fn(
& X::f));
};

void  k(std::vector < boost::shared_ptr < X >   >   const   &  v)
{
    std::for_each(v.begin(), v.end(), boost::mem_fn(
& X::f));
};

你可能感兴趣的:(boost::mem_fn 从成员函数指针到函数对象)