นี่คือการใช้งานทั่วไปของตัวชี้ฟังก์ชันใน 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 จากนั้นสัญลักษณ์จะถูกค้นหาในไลบรารีที่แบ่งใช้ในขณะใช้งาน
โปรดทราบว่าหนึ่งขั้นตอนนี้เกินกว่า "โรงงาน" มันเป็นสิ่งที่ตรงกันข้ามกับอุปกรณ์ควบคุมที่คล้ายกับสิ่งที่ Martin Fowler เรียกว่า "service locator"
หมายเหตุ: สิ่งนี้เกิดขึ้นในการติดต่อส่วนตัวของฉันกับเจดบราวน์ที่ซึ่งเขาถามคำถามนี้ให้ฉัน ฉันตัดสินใจที่จะ outsource มันและดูว่าผู้คนสามารถหาคำตอบได้อย่างไร