Ponteiros para funções não são ponteiros de dados simples, pois não podem ser armazenados em um ponteiro nulo *. No entanto, parece que eu posso armazenar a cópia de um ponteiro de função na memória dinâmica (no gcc e no clang) como no código abaixo. Esse código é legal de acordo com o padrão C ++, ou talvez seja algum tipo de extensão do compilador?
Além disso, o ponteiro resultante para o ponteiro de função se comporta como um ponteiro simples de dados: eu posso armazená-lo no vácuo * e recuperá-lo do vácuo * pelo static_cast. Esse comportamento é garantido pelo Padrão?
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 ;
}
newelenco void*. void* ptr = &fcnPtr;funciona tão bem, já que fcnPtré um objeto, não uma função.
std::functioné um contêiner apagado por tipo para armazenar uma chamada arbitrária, não é realmente um substituto para ponteiros de função ...
std::function. É excelente por sua capacidade de armazenar funções "polimórficas" (ou seja, qualquer coisa com a assinatura correta, mesmo que contenha estado como no caso de algumas lambdas), mas isso também adiciona sobrecarga que pode não ser necessária. Um ponteiro para uma função é POD. A std::functionnão é.
void*, portanto, no contexto dessa pergunta, std::functionparece exatamente o que eles estavam procurando. Concordo que a dispensa geral dos indicadores de função do SPD não é doentia.
std::functionvez disso.