I puntatori alle funzioni non sono semplici puntatori di dati in quanto non possono essere memorizzati in un puntatore void *. Tuttavia, sembra che sia possibile memorizzare la copia di un puntatore a funzione nella memoria dinamica (in gcc e clang) come nel codice seguente. Un tale codice è legale secondo lo standard C ++ o forse si tratta di una sorta di estensione del compilatore?
Inoltre, il puntatore risultante al puntatore-funzione si comporta come un semplice puntatore di dati: posso memorizzarlo in void * e recuperarlo da void * tramite static_cast. Questo comportamento è garantito dalla norma?
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 ;
}
newcast a void*. void* ptr = &fcnPtr;funziona altrettanto bene, poiché fcnPtrè un oggetto, non una funzione.
std::functionè un contenitore cancellato dal tipo per l'archiviazione di una chiamata arbitraria, non proprio un sostituto per i puntatori a funzione ...
std::function. È ottimo per la sua capacità di memorizzare funzioni "polimorfiche" (cioè qualsiasi cosa con la firma giusta, anche se contiene stato come nel caso di alcuni lambda), ma ciò aggiunge anche un sovraccarico che potrebbe non essere necessario. Un puntatore a una funzione è POD. A std::functionnon lo è.
void*, quindi nel contesto di questa domanda std::functionsembra essere esattamente quello che stavano cercando. Sono d'accordo sul fatto che il licenziamento generale da parte di SPD dei puntatori a funzioni non sia corretto.
std::functioninvece.