Dưới đây là cách sử dụng điển hình của các con trỏ hàm trong C. Tôi muốn làm một cái gì đó tương tự trong Fortran. Tôi có một số ý tưởng, nhưng tôi muốn biết nếu có một số cách kinh điển để làm như vậy.
Các con trỏ hàm và bối cảnh được người dùng truyền vào được lưu trữ, sau đó được gọi sau.
typedef PetscErrorCode (*TSIFunction)(TS,PetscReal,Vec,Vec,Vec,void*);
PetscErrorCode TSSetIFunction(TS ts,Vec res,TSIFunction f,void *ctx);
Chức năng của người dùng được gọi lại bằng cách sử dụng bối cảnh của họ tại các thời điểm khác nhau.
Trong PETSc, họ cũng sử dụng rất nhiều chuỗi -> bảng con trỏ hàm. Tất cả mọi thứ là một plugin, vì vậy người dùng có thể đăng ký triển khai của riêng họ và họ là hạng nhất.
#define PCGAMG "gamg"
PCRegisterDynamic(PCGAMG ,path,"PCCreate_GAMG",PCCreate_GAMG);
Điều này đăng ký thói quen tạo trong một "FList", sau đó PCSetFromOptions () cung cấp khả năng chọn phương thức này so với bất kỳ lựa chọn nào khác. Nếu hệ thống hỗ trợ tải động, bạn có thể bỏ qua sự phụ thuộc thời gian biên dịch vào biểu tượng PCCreate_GAMG và chỉ cần vượt qua NULL, sau đó biểu tượng sẽ được tra cứu trong thư viện dùng chung trong thời gian chạy.
Lưu ý rằng bước này vượt ra khỏi một "nhà máy", đó là một thiết bị điều khiển đảo ngược tương tự như cái mà Martin Fowler gọi là "công cụ định vị dịch vụ".
Lưu ý: điều này xuất hiện trong thư từ riêng tư của tôi với Jed Brown, nơi anh ấy hỏi tôi câu hỏi này. Tôi quyết định thuê ngoài nó và xem những câu trả lời mà mọi người có thể đưa ra.