Bien que vous ne puissiez malheureusement pas convertir un pointeur de fonction membre existant en un pointeur de fonction ordinaire, vous pouvez créer un modèle de fonction d'adaptation d'une manière assez simple qui enveloppe un pointeur de fonction membre connu au moment de la compilation dans une fonction normale comme celle-ci :
template <class Type>
struct member_function;
template <class Type, class Ret, class... Args>
struct member_function<Ret(Type::*)(Args...)>
{
template <Ret(Type::*Func)(Args...)>
static Ret adapter(Type &obj, Args&&... args)
{
return (obj.*Func)(std::forward<Args>(args)...);
}
};
template <class Type, class Ret, class... Args>
struct member_function<Ret(Type::*)(Args...) const>
{
template <Ret(Type::*Func)(Args...) const>
static Ret adapter(const Type &obj, Args&&... args)
{
return (obj.*Func)(std::forward<Args>(args)...);
}
};
int (*func)(A&) = &member_function<decltype(&A::f)>::adapter<&A::f>;
Notez qu'afin d'appeler la fonction membre, une instance de A
doit être fournie.