函数子可匹接
函数子可匹接:
经常我们会同not1对函数返回进行转义:
bool isInteresting(const node* p);
find_if(c.begin(),c.end(),not1(isInteresting));
但实际上isInteresting作为一个基本的函数指针,缺少not1所需要的函数定义。
unary_function和binary_function:
比较简便的方法就是从STL中继承上面这两个基类。所以函数子经常会出现下面这种代码
class MeetsThread : public std::unary_function<Widget , bool>{}
继承模板中的参数,就是operator()操作的输入和返回。
ptr_fun、mem_fun、mem_fun_ref:
就像for_each函数,是通过传递函数对象,然后让其调用容器中元素。
对于成员函数等就需要一些特殊的处理。
f(x); //语法1
x.f(); //语法2
p->f(); //语法3
mem_fun:
list<node *> it;
for_each( it.begin() ,it.end() ,mem_fun(&node::test)) ;
可以读入一个成员函数的指针,然后返回一个mem_fun_t对象.
- mem_fun_t:一个函数子类,拥有该成员函数的指针,并提供了operator(),将语法3变成语法1调用
mem_fun_ref:
mem_fun_ref函数与mem_fun函数很像,只是会将语法2变成语法1
ptr_fun/bind1st/bin2nd:
ptr_fun是将一个普通的函数适配成一个functor
bind1st和bind2nd函数把一个二元函数对象绑定成为一个一元函数对象。
bind1st是绑定第一个参数,bind2nd则是绑定第二个参数。
int sum(int arg1, int arg2)
{
cout<<"ARG 1: "<<arg1<<endl;
cout<<"ARG 2: "<<arg2<<endl;
int sum = arg1 + arg2;
cout<<"SUM: "<<sum<<endl;
return sum;
}
int main(int argc,char* argv[])
{
bind1st(ptr_fun(sum),1)(2); // the same as sum(1,2) ,在第一个参数绑定1
bind2nd(ptr_fun(sum),1)(2); //the same as sum(2,1) ,在第二个参数绑定1
getchar();
return 0;
}
参考:
Effective STL