Los punteros a funciones no son punteros de datos simples ya que no pueden almacenarse en un puntero nulo *. No obstante, parece que puedo almacenar la copia de un puntero de función en la memoria dinámica (en gcc y clang) como en el código a continuación. ¿Es legal ese código de acuerdo con el estándar C ++, o tal vez esta es una especie de extensión del compilador?
Además, el puntero resultante a puntero de función se comporta como un puntero de datos simple: puedo almacenarlo en void * y recuperarlo de void * mediante static_cast. ¿Es este comportamiento garantizado por la 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 ;
}
newpara lanzar void*. void* ptr = &fcnPtr;funciona igual de bien, ya que fcnPtres un objeto, no una función.
std::functiones un contenedor de tipo borrado para almacenar una llamada arbitraria, no es realmente un reemplazo para los punteros de función ...
std::function. Es excelente por su capacidad para almacenar funciones "polimórficas" (es decir, cualquier cosa con la firma correcta, incluso si contiene el estado como en el caso de algunas lambdas), pero eso también agrega una sobrecarga que puede no ser necesaria. Un puntero a una función es POD. A std::functionno lo es.
void*, por lo que en el contexto de esta pregunta std::functionparece ser exactamente lo que estaban buscando. Estoy de acuerdo en que el rechazo general de SPD de los punteros de función no es sólido.
std::functionlugar.