C++函数对象 (Function object)

    以前没接触过函数对象这东西,前几天上课老师讲了一下,发现还慢有意思的,这样就可以不用函数指针了。Function object是一个对象,不过它的行为表现像函数。一般而言,它是由一个重载了operator()的类所实例化得来的对象。 Function object的涵义比通常意义上的函数更广泛,因为它可以在多次调用之间保持某种“状态”——这和静态局部变量有异曲同工之妙;不过这种“状态”还可以被初始化,还可以从外面来检测,这可要比静态局部变量强了。虽然传递函数指针被广泛应用于事件驱动系统中,以此实现回调函数通过指针来调用。但 C++ 还是提供了另外一种可供选择的办法,即函数对象,利用它可以避免使用函数指针。这样做有几个优点。首先, 因为对象可以在内部修改而不用改动外部接口,因此设计更灵活,更富有弹性。函数对象也具备有存储先前调用结果的数据成员。此外,编译器可以内联函数对象,从而进一步增强性能。函数对象可以具体表达依赖成员模板的通用算法 , 这些算法借助普通的函数指针难以完成。写个小示例:
    

#include "stdafx.h"

 

#include <iostream>

#include <functional>

 

using namespace std;

 

class Action;

class Drink;

class Eat;

class TestAction;

 

class Action

{

public:   

       int operator()(int i)

       {

              Act(i);

              return i;

       }

 

       virtual void Act(int i) = 0;

};

 

class Drink : public Action

{

       void Act(int i)

       {

              cout<<"No. "<<i<<" drink..."<<endl;

       }

};

 

class Eat : public Action

{

       void Act(int i)

       {

              cout<<"No. "<<i<<" eat..."<<endl;

       }    

};

 

class TestAction

{

public:

       void TestAct(int i, Action& testAct)

       {    

              testAct(i);

       }

};

 

int main(int argc, char* argv[])

{           

       TestAction doact;              

       doact.TestAct(0, Drink());

       doact.TestAct(1, Drink());

       doact.TestAct(2, Drink());  

       doact.TestAct(0, Eat());

       doact.TestAct(1, Eat());

       doact.TestAct(2, Eat());

       return 0;

}


posted @ 2007-11-26 23:27  yiling  阅读(2479)  评论(3编辑  收藏  举报