C++ 仿函数

来源:互联网 发布:淘宝二楼视频男主角 编辑:程序博客网 时间:2024/04/29 06:43
在我们写代码时有时会发现有些功能的实现的代码,会不断的在不同的成员函数中用到,但是又不好将这些代码独立出来成为一个类的一个成员函数。但是又很想复用这些代码。写一个公共的函数,可以,这是一个解决方法,不过函数用到的一些变量,就可能成为公共的全局变量,再说为了复用这么一片代码,就要单立出一个函数,也不是很好维护。这时就可以用仿函数了,写一个简单类,除了那些维护一个类的成员函数外,就只是实现一个operator(),在类实例化时,就将要用的,非参数的元素传入类中。这样就免去了对一些公共变量的全局化的维护了。又可以使那些代码独立出来,以便下次复用。

仿函数(functor),是通过重载()运算符模拟函数形为的类。
因此,这里需要明确两点:
1 仿函数不是函数,它是个类;

2 仿函数重载了()运算符,使得它可以像函数那样子调用(代码的形式好像是在调用函数)。


实例:

#include <iostream>using namespace std;class Compare{public:bool operator()(int num1, int num2) const{if (num1 <= num2)return true;elsereturn false;}};void sort(int *array, int size, const Compare &cmp){if (array == NULL)return;for (int i=0; i<size-1; i++){for (int j=0; j<=size-2-i; j++){if (!(cmp(array[j], array[j+1]))){array[j] = array[j]^array[j+1];array[j+1] = array[j+1]^array[j];array[j] = array[j]^array[j+1];}}}}void list(const int *array, int size){if (array == NULL)return;for(int i=0; i< size; i++)cout << array[i] << " ";cout << endl;}int main(){int array[] = {0, 9, 8, 7, 6, 5, 4, 3, 2, 1};sort(array, sizeof(array)/sizeof(int), Compare());list(array, sizeof(array)/sizeof(int));return 0;}

sort()中cmp为Comparer类的一个对象,但这里的用法好像它是某个函数的样子。这就是仿函数的真谛



0 0
原创粉丝点击