Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do we use std::function in C++ rather than the original C function pointer? [duplicate]

What is the advantage of std::function<T1(T2)> over the original T1 (*)(T2)?

like image 981
Michael Dorst Avatar asked Jul 05 '12 21:07

Michael Dorst


3 Answers

std::function can hold more than function pointers, namely functors.

#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);
}

Live example on Ideone.

As the example shows, you also don't need the exact same signature, as long as they are compatible (i.e., the parameter type of std::function can be passed to the contained function / functor).

like image 82
Xeo Avatar answered Nov 13 '22 04:11

Xeo


std::function can hold function objects (including lambdas), as well as function pointers with the correct signature. So it is more versatile.

like image 17
Benjamin Lindley Avatar answered Nov 13 '22 05:11

Benjamin Lindley


Apart from the cleaner look and a more descriptive syntax, std::function can store any callable object:

  • functions
  • lambda expressions
  • bind expressions
  • functors

Not to mention that storing, copying, and binding objects to member functions is much easier and more intuitive.

like image 11
Shoe Avatar answered Nov 13 '22 04:11

Shoe