In Bjarne Stroustrup‘s home page (C++11 FAQ):
struct X { int foo(int); };
std::function<int(X*, int)> f;
f = &X::foo; //pointer to member
X x;
int v = f(&x, 5); //call X::foo() for x with 5
How does it work? How does std::function call a foo member function?
The template parameter is int(X*, int), is &X::foo converted from the member function pointer to a non-member function pointer?!
(int(*)(X*, int))&X::foo //casting (int(X::*)(int) to (int(*)(X*, int))
To clarify: I know that we don’t need to cast any pointer to use std::function, but I don’t know how the internals of std::function handle this incompatibility between a member function pointer and a non-member function pointer. I don’t know how the standard allows us to implement something like std::function!
After getting help from other answers and comments, and reading GCC source code and C++11 standard, I found that it is possible to parse a function type (its return type and its argument types) by using partial template specialization and
function overloading.
The following is a simple (and incomplete) example to implement something like
std::function:Usage: