Aqui está um uso típico de ponteiros de função em C. Eu gostaria de fazer algo semelhante no Fortran. Tenho algumas idéias, mas gostaria de saber se existe alguma maneira canônica de fazer isso.
Os ponteiros de função e os contextos transmitidos pelo usuário são armazenados e depois chamados posteriormente.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
A função do usuário é chamada de volta usando seu contexto em vários momentos posteriores.
No PETSc, eles também usam muito as tabelas de ponteiros de função string>. Tudo é um plugin, para que o usuário possa registrar suas próprias implementações e elas são de primeira classe.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Isso registra a rotina de criação em um "FList" e, em seguida, PCSetFromOptions () oferece a capacidade de escolher esse método em comparação com qualquer uma das outras opções. Se o sistema suportar carregamento dinâmico, você poderá pular a dependência do símbolo PCCreate_GAMG em tempo de compilação e passar NULL, em seguida, o símbolo será procurado na biblioteca compartilhada em tempo de execução.
Observe que este passo além de uma "fábrica", é uma inversão do dispositivo de controle semelhante ao que Martin Fowler chama de "localizador de serviço".
Nota: isso surgiu em minha correspondência particular com Jed Brown, onde ele me fez essa pergunta. Decidi terceirizá-lo e ver quais respostas as pessoas podem apresentar.