Xeo*_*Xeo 33

std::function可以容纳多个函数指针,即仿函数.

#include <functional>

void foo(double){}

struct foo_functor{
  void operator()(float) const{}
};

int main(){
  std::function<void(int)> f1(foo), f2((foo_functor()));
  f1(5);
  f2(6);
}
Run Code Online (Sandbox Code Playgroud)

Ideone上的实例.

如示例所示,您也不需要完全相同的签名,只要它们是兼容的(即,参数类型std::function可以传递给包含的函数/函子).

  • 此外,使用`std :: bind`可以创建委托(即用对象封装成员函数指针)并将它们存储在std :: function中,创建后的处理没有任何区别.这是函数指针本身无法实现的功能. (4认同)
  • @fish:嗯,`std :: bind`返回的是一个仿函数,所以我不会特别这样.可以看作特别的是你只需要传递一个成员函数指针,`std :: function`就可以像`f(object,param);`那样调用它.[Ideone上的示例](http://ideone.com/haRtx) (2认同)

Ben*_*ley 16

std::function可以保存函数对象(包括lambdas),以及具有正确签名的函数指针.所以它更通用.

  • @Mehrdad:`std :: function <>`需要添加一个间接来执行类型擦除,所以是的,有一个额外级别的间接con通过`std :: function`调用lambda(好吧,调用lambda或者通过`std :: function`)的任何其他事情 (3认同)
  • @Mehrdad:你对*虚拟*的定义是什么? (2认同)
  • @anthropomorphic:不,`virtual`表示它在派生类中是*overridable*. (2认同)

Sho*_*hoe 7

除了更清晰的外观和更具描述性的语法,std::function还可以存储任何可调用的对象:

  • 功能
  • lambda表达式
  • 绑定表达式
  • 函子

更不用说将对象存储,复制和绑定到成员函数更容易,更直观.

  • 绑定表达式只是返回仿函数,因此同时列出仿函数和绑定表达式是多余的。 (2认同)