Ось типове використання функціональних покажчиків у C. Я хотів би зробити щось подібне у Fortran. У мене є деякі ідеї, але я хотів би знати, чи є якийсь канонічний спосіб зробити це.
Показники функцій та контексти, передані користувачем, зберігаються, потім викликаються пізніше.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
Функція користувача передзвонюється, використовуючи їх контекст у різні пізніші часи.
У PETSc вони також активно використовують таблиці вказівників string ->. Все є плагіном, тому користувач може зареєструвати власні реалізації та вони першокласні.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Це реєструє процедуру створення у "FList", тоді PCSetFromOptions () пропонує можливість вибору цього методу порівняно з будь-яким з інших варіантів. Якщо система підтримує динамічне завантаження, ви можете пропустити залежність часу компіляції від символу PCCreate_GAMG і просто пропустити NULL, тоді символ буде шуканий у спільній бібліотеці під час виконання.
Зауважте, що цей крок за межі "фабрики" - це інверсія пристрою управління, аналогічна тому, що Мартін Фаулер називає "локатором обслуговування".
Зауважте: це з’явилось у моєму приватному листуванні з Джедом Брауном, де він задав мені це питання. Я вирішив передати це в аутсорсинг і подивитися, які відповіді люди можуть придумати.