Aquí hay un uso típico de los punteros de función en C. Me gustaría hacer algo similar en Fortran. Tengo algunas ideas, pero me gustaría saber si hay alguna forma canónica de hacerlo.
Los punteros de función y los contextos pasados por el usuario se almacenan y luego se llaman más tarde.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
La función del usuario se vuelve a llamar utilizando su contexto en varios momentos posteriores.
En PETSc, también hacen un uso intensivo de cadenas -> tablas de puntero de función. Todo es un complemento, por lo que el usuario puede registrar sus propias implementaciones y son de primera clase.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Esto registra la rutina de creación en un "FList", luego PCSetFromOptions () ofrece la posibilidad de elegir este método frente a cualquiera de las otras opciones. Si el sistema admite carga dinámica, puede omitir la dependencia en tiempo de compilación del símbolo PCCreate_GAMG y simplemente pasar NULL, entonces el símbolo se buscará en la biblioteca compartida en tiempo de ejecución.
Tenga en cuenta que este paso más allá de una "fábrica", es una inversión del dispositivo de control similar a lo que Martin Fowler llama "localizador de servicio".
Nota: esto surgió en mi correspondencia privada con Jed Brown, donde me hizo esta pregunta. Decidí externalizarlo y ver qué respuestas pueden dar las personas.