转自:C++中如何区分构造函数与重载operator()得到的仿函数?求大神!_360问答
此外,你觉得仿函数(functor)是否能完全取代function呢?
以下是个人使用C++仿函数,function表达式的一些体悟。
首先是定义形式:
构造函数无返回值,而operator是可以有返回值的;
定义时,构造函数需要类名,而重载operator()则不用;
其次是调用形式:
构造函数是声明对象,而仿函数则需要声明好的对象进行调用。
functor是仿函数,function是函数还是std::function?
如果是函数的话,个人感觉不会替代。因为毕竟C++是C的超集,而C中很多用到函数指针的地方,functor可能并不那么好用。
如果是std::function的话,那感觉也不会替代,因为std::function配合std::bind可以处理函数及仿函数。bind()接受一个函数(或者函数对象,或者任何你可以通过”(…)”符号调用的事物),生成一个其有某一个或多个函数参数被“绑定”或重新组织的函数对象。而functor好像不能以std::function作为参数传入。
话说仿函数即函数对象书写比较费事,所以C++ 11增加了lambda表达式,即匿名函数。函数对象即仿函数多用于C++ STL中,而在微软新加入的并行库PPL中,task等并不接受仿函数,多用lambda表达式。更容易。
希望不会误人子弟。
追问 : 谢谢!您的分析给了我很大启发,确实两者之间还是有着很大差距的。还有一个小问题想请教一下,我现在准备实现一个小的动态语言解释器。如果将里面的函数用伪函数的思想来实现的话就能很方便地将函数和对象统一起来。我想问问我这想法可以实施吗?
追答 : 可以。仿函数本来就是一个对象,但是它可以像函数一样调用,所以叫仿函数。另外仿函数是可以带状态的(即可以带一些附加数据)。而函数指针式是不可以的。