Hier ist eine typische Verwendung von Funktionszeigern in C. Ich möchte etwas Ähnliches in Fortran tun. Ich habe einige Ideen, aber ich würde gerne wissen, ob es einen kanonischen Weg gibt, dies zu tun.
Die vom Benutzer übergebenen Funktionszeiger und Kontexte werden gespeichert und später aufgerufen.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
Die Funktion des Benutzers wird zu verschiedenen späteren Zeitpunkten unter Verwendung seines Kontexts zurückgerufen.
In PETSc verwenden sie auch stark String -> Funktionszeigertabellen. Alles ist ein Plugin, so dass der Benutzer seine eigenen Implementierungen registrieren kann und sie erstklassig sind.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Dadurch wird die Erstellungsroutine in einer "FList" registriert, und PCSetFromOptions () bietet die Möglichkeit, diese Methode im Vergleich zu anderen Optionen auszuwählen. Wenn das System das dynamische Laden unterstützt, können Sie die Abhängigkeit zur Kompilierungszeit vom PCCreate_GAMG-Symbol überspringen und einfach NULL übergeben. Anschließend wird das Symbol zur Laufzeit in der gemeinsam genutzten Bibliothek nachgeschlagen.
Beachten Sie, dass dies ein Schritt über eine "Fabrik" hinaus eine Umkehrung des Steuergeräts ist, ähnlich dem, was Martin Fowler "Service Locator" nennt.
Hinweis: Dies kam in meiner privaten Korrespondenz mit Jed Brown zum Ausdruck, in der er mir diese Frage stellte. Ich beschloss, es auszulagern und zu sehen, welche Antworten die Leute finden können.