Berikut ini adalah penggunaan khas pointer fungsi di C. Saya ingin melakukan sesuatu yang serupa di Fortran. Saya punya beberapa ide, tetapi saya ingin tahu apakah ada cara kanonik untuk melakukannya.
Pointer fungsi dan konteks yang dilewatkan oleh pengguna disimpan, lalu dipanggil nanti.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
Fungsi pengguna dipanggil kembali menggunakan konteks mereka di berbagai waktu kemudian.
Dalam PETSc, mereka juga menggunakan string -> tabel pointer fungsi. Semuanya adalah plugin, sehingga pengguna dapat mendaftarkan implementasi mereka sendiri dan mereka adalah kelas satu.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Ini mendaftarkan kreasi rutin dalam "FList", lalu PCSetFromOptions () menawarkan kemampuan untuk memilih metode ini dibandingkan pilihan lainnya. Jika sistem mendukung pemuatan dinamis, Anda dapat melewati dependensi waktu kompilasi pada simbol PCCreate_GAMG dan hanya melewati NULL, maka simbol tersebut akan dicari di perpustakaan bersama saat run time.
Perhatikan bahwa ini satu langkah di luar "pabrik", itu adalah inversi perangkat kontrol yang mirip dengan apa yang Martin Fowler sebut "pelacak layanan".
Catatan: ini muncul dalam korespondensi pribadi saya dengan Jed Brown, di mana ia mengajukan pertanyaan ini kepada saya. Saya memutuskan untuk melakukan outsourcing dan melihat jawaban apa yang bisa diberikan orang.