STL函数对象:与函数指针的比较

来源:互联网 发布:讲文明知礼仪的故事 编辑:程序博客网 时间:2024/06/05 11:14

一、函数对象、函数指针的定义和使用

      二者定义方式不同,使用方式相同。

#include <iostream>using namespace std;//function objectclass obj_Add{public:int operator() (int val1, int val2){return val1 + val2;}};//function pointerint fun_Add(int val1, int val2){return val1 + val2;}int main(int argc, char *argv[]){//function objectobj_Add obj_add;cout<<obj_add(2,8)<<endl;//function pointertypedef int (*FUN_ADD)(int, int);FUN_ADD fun_add = &fun_Add;cout<<fun_add(3,8)<<endl;return 1;};
二、函数对象、函数指针的区别

2.1 函数对象内可以携带附加数据,函数指针不行

      见博客《STL函数对象:定义、及其在STL中的应用》中的2.2节。

      http://blog.csdn.net/guowenyan001/article/details/10017799

2.2 函数对象可以用来封装类成员函数指针

#include <iostream>using namespace std;//function objecttemplate <typename T>class fun_Obj{public:fun_Obj(void (T::*f)(char *), T* t): pFunc(f), m_t(t) { }public:void operator() (char* name){(m_t->*pFunc)(name);}private:void (T::*pFunc)(char *);T* m_t;};//class output_Obj{public:void output(char* name){cout<<"Hello "<<name<<endl;}};//int main(int argc, char *argv[]){output_Obj output_obj;fun_Obj<output_Obj> fun_obj(&output_Obj::output, &output_obj);fun_obj("world.");return 1;};

三、让一个函数既接受函数指针,又接受函数对象,最简单的方法就是使用模板。

#include <iostream>using namespace std;//function objectclass great{public:great(int val) : m_val(val) { }public:bool operator() (int val){return val > m_val;}private:int m_val;};//function pointerbool great10(int val){return val > 10;}//functiontemplate <typename FUNC>int count_n(int* arr, int n, FUNC func){int count = 0;for(int i=0; i<n; ++i){if(func(arr[i]))count++;}return count;}//int main(int argc, char *argv[]){int arr[5] = {50,40, 8, 3, 15};//function objectcout<<count_n(arr, 5, great(10))<<endl;//function pointercout<<count_n(arr, 5, great10)<<endl;return 1;};



原创粉丝点击