Cでの関数ポインターの典型的な使用法を次に示します。Fortranでも同様のことをしたいと思います。私はいくつかのアイデアを持っていますが、そうするための標準的な方法があるかどうかを知りたいです。
ユーザーによって渡された関数ポインターとコンテキストは保存され、後で呼び出されます。
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
ユーザーの関数は、さまざまな時間にコンテキストを使用してコールバックされます。
PETScでは、文字列->関数ポインターテーブルも多用します。すべてがプラグインであるため、ユーザーは独自の実装を登録でき、一流です。
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
これにより、作成ルーチンが「FList」に登録され、PCSetFromOptions()がこのメソッドを他の選択肢と比較して選択できるようになります。システムが動的ロードをサポートしている場合、PCCreate_GAMGシンボルのコンパイル時の依存関係をスキップしてNULLを渡すだけで、シンボルは実行時に共有ライブラリで検索されます。
これは「工場」を超えた一歩であり、マーティン・ファウラーが「サービスロケーター」と呼ぶものに似た制御デバイスの反転であることに注意してください。
注:これは、Jed Brownとの個人的なやり取りで出てきたもので、Jed Brownがこの質問をしてくれました。私はそれを外部委託し、人々が思い付くことができる答えを見ることにしました。