以前没接触过函数对象这东西,前几天上课老师讲了一下,发现还慢有意思的,这样就可以不用函数指针了。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;
}
转自Yiling的眷眷的博客。
C++函数对象 (Function object)
最新推荐文章于 2024-11-28 11:19:24 发布