Les pointeurs vers des fonctions ne sont pas de simples pointeurs de données car ils ne peuvent pas être stockés dans un pointeur void *. Néanmoins, il semble que je puisse stocker la copie d'un pointeur de fonction dans la mémoire dynamique (en gcc et clang) comme dans le code ci-dessous. Un tel code est-il légal selon la norme C ++, ou peut-être s'agit-il d'une sorte d'extension de compilateur?
De plus, le pointeur résultant vers le pointeur de fonction se comporte comme un pointeur de données simple: je peux le stocker dans void * et le récupérer de void * par static_cast. Ce comportement est-il garanti par la norme?
int main()
{
extern void fcn();
void (*fcnPtr)() = &fcn;
void (**ptrToFcnPtr)() = nullptr;
//Make the copy of fcnPtr on the heap:
ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr);
//Call the pointed-to function :
(**ptrToFcnPtr)();
//Save the pointer in void* :
void *ptr = ptrToFcnPtr;
//retrieve the original ptr:
auto myPtr = static_cast< void(**)() > (ptr) ;
//free memory:
delete ptrToFcnPtr ;
}
newlancer void*. void* ptr = &fcnPtr;fonctionne aussi bien, car fcnPtrest un objet, pas une fonction.
std::functionest un conteneur de type effacé pour stocker un appel arbitraire, pas vraiment un remplacement pour les pointeurs de fonction…
std::function. C'est génial pour sa capacité à stocker des fonctions "polymorphes" (c'est-à-dire tout ce qui a la bonne signature, même s'il contient un état comme dans le cas de certains lambdas), mais cela ajoute également des frais généraux qui peuvent ne pas être nécessaires. Un pointeur vers une fonction est POD. A std::functionne l'est pas.
void*, donc dans le contexte de cette question std::functionsemble être exactement ce qu'ils cherchaient. Je suis d'accord que le rejet général par SPD des pointeurs de fonction n'est pas valable.
std::functionplutôt.