C++回调函数(callback)与仿函数(functor)的异同
当前位置:以往代写 > C/C++ 教程 >C++回调函数(callback)与仿函数(functor)的异同
2019-06-13

C++回调函数(callback)与仿函数(functor)的异同

C++回调函数(callback)与仿函数(functor)的异同

回调函数(callback)与仿函数(functor)许多时候从用途上来看很相似,乃至于我们常常 将它们相提并论。譬喻:

inline bool compare(int a, int b)
{
   return a > b;
}
 
struct comparer {
  bool operator()(int a, int b) const {
     return a > b;
  }
};
 
void main()
{
   std::vector<int> vec, vec2;
   std::sort(vec.begin(), vec.end(), compare);
   std::sort(vec2.begin(), vec2.end(), comparer());
}

仿函数(functor)之所以称为仿函数,是因为这是一种操作某些类工具支持operator()的 特性,来到达模仿函数挪用结果的技能。

假如这里vec, vec2这两个vector的内容一样,那么从执行功效看,利用回调函数compare 与利用仿函数comparer是一样的。

那么,我们应该用回调,照旧用仿函数?

许多人都说用仿函数吧,回调函数是丑恶的,代码不太象C++气势气魄。

但其实问题的本质不是在代码气势气魄上,仿函数与回调函数各有利弊,不能一概而论。

仿函数(functor)的利益

我的发起是,假如可以用仿函数实现,那么你应该用仿函数,而不要用回调。原因在于:

仿函数可以不带陈迹地通报上下文参数。而回调技能凡是利用一个特另外void*参数通报 。这也是大都人认为回调技能丑恶的原因。

更好的机能。

仿函数技能可以得到更好的机能,这点直观来讲较量难以领略。你大概说,回调函数申明 为inline了,怎么会机能比仿函数差?我们这里来阐明下。我们假设某个函数func(譬喻上 面的std::sort)挪用中通报了一个回调函数(如上面的compare),那么可以分为两种环境 :

func是内联函数,而且较量简朴,func挪用最终被展开了,那么个中对回调函数的挪用也 成为一普通函数挪用(而不是通过函数指针的间接挪用),而且假如这个回调函数假如简朴 ,那么也大概同时被展开。在这种景象下,回调函数与仿函数机能沟通。

func长短内联函数,可能较量巨大而无法展开(譬喻上面的std::sort,我们知道它是快 速排序,函数因为存在递归而无法展开)。此时回调函数作为一个函数指针传入,其代码亦 无法展开。而仿函数则差异。固然func自己巨大不能展开,可是func函数中对仿函数的挪用 是编译器编译期间就可以确定并举办inline展开的。因此在这种景象下,仿函数比之于回调 函数,有着更好的机能。而且,这种机能优势有时是一种无可相比的优势(对付std::sort就 是如此,因为元素较量的次数很是庞大,是否可以举办内联展启发致了一种雪崩效应)。

仿函数(functor)不能做的?

话又说返来了,仿函数并不能完全代替回调函数所有的应用场所。譬喻,我在 std::AutoFreeAlloc中利用了回调函数,而不是仿函数,这是因为AutoFreeAlloc要容纳异质 的析构函数,而不是只支持某一种类的析构。这和模板(template)不能处理惩罚在同一个容器 中支持异质范例,是一个原理。

    关键字:

在线提交作业