什么叫函数对象(仿函数)

  1. 许多情况下直接传入一个全局指针函数是不会报错的,有时则不然,例如:bind2nd(),这时需要使用ptr_fun;  
  2. //当一个函数指针是类成员函数时,编译将不能通过。此时将使用到了mem_fun和mem_fun_ref。  
  3.   
  4. //指针函数一般分三种,全局函数指针,对象成员函数指针根据对象是指针还是引用有分为两种。  
  5. //1)fun();          使用 ptr_fun  
  6. //2)a.fun();        使用 mem_fun_ref  
  7. //3)p->fun();        使用 mem_fun  
  8.   
  9. //普通的C++程序多使用函数指针做参数传递,在STL中是使用仿函数做为参数传递标准,来提供函数指针的类似功能。  
  10. //以上三个函数就是将函数指针转化为彷函数的桥梁。  


仿函数(functors)在C++标准中采用的名称是函数对象(function objects)。仿函数主要用于STL中的算法中,虽然函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求,也不能满足软件积木的要求–函数指针无法和STL其他组件搭配,产生更灵活变化。

仿函数本质就是类重载了一个operator(),创建一个行为类似函数的对象。例如下面就是一个仿函数的例

[cpp] 
view plain
copy
《什么叫函数对象(仿函数)》
《什么叫函数对象(仿函数)》

  1. struct plus{  
  2.     int operator()(const int& x, const int& y) const { return x + y; }  
  3. };  

然后就可以如下这样使用

[cpp] 
view plain
copy
《什么叫函数对象(仿函数)》
《什么叫函数对象(仿函数)》

  1. int a=1, b=2;  
  2. cout<<plus(a,b);  

这样其实创建了一个临时无名的对象,之后调用其重载函数()。

但是STL中的仿函数不是这个样子的,为了使仿函数拥有被函数配接其(function adapter)修饰,彼此像积木一样地串接。仿函数应该定义自己相应的类别(associative types)。就像迭代器一样,为了融入STL,必须定义自己的5个相应类别。这样做的目的是为了让配接器能够取出,获得反函数的某些信息。相应类别都是一下typedef定义的预处理,在编译时就完成了替代,对程序执行效率没有影响,也不带来任何额外的负担。

仿函数相应的类别主要用来表现函数参数类型和返回值类型。在<stl_function.h>定义了两个struct,分别代表一元仿函数和二元仿函数。

[cpp] 
view plain
copy
《什么叫函数对象(仿函数)》
《什么叫函数对象(仿函数)》

  1. // C++ Standard 规定,每一個 Adaptable Unary Function 都必须继承此类别  
  2. template <class Arg, class Result>  
  3. struct unary_function {  
  4.     typedef Arg argument_type;  
  5.     typedef Result result_type;  
  6. };  
  7.   
  8. // C++ Standard 規定,每一個 Adaptable Binary Function 都必须继承此类别  
  9. template <class Arg1, class Arg2, class Result>  
  10. struct binary_function {  
  11.     typedef Arg1 first_argument_type;  
  12.     typedef Arg2 second_argument_type;  
  13.     typedef Result result_type;  
  14. };  

仿函数按照运算来分类,有以下3类:

1)算术类仿函数

    加:plus<T>

    减:minus<T>

    乘:multiplies<T>

    除:divides<T>

    模取:modulus<T>

    否定:negate<T>

2)关系运算类仿函数

    等于:equal_to<T>

    不等于:not_equal_to<T>

    大于:greater<T>

    大于等于:greater_equal<T>

    小于:less<T>

    小于等于:less_equal<T>

3)逻辑运算仿函数

    逻辑与:logical_and<T>

    逻辑或:logical_or<T>

    逻辑否:logical_no<T>


来自:http://blog.csdn.net/kangroger/article/details/38681383


    原文作者:美了美了
    原文地址: https://blog.csdn.net/xyblog/article/details/50377942
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞