这是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)称之为“服务定位器”的控制设备的倒置。
注意:这是在我与杰德·布朗的私人通信中提出的,他在那儿向我提出了这个问题。我决定将其外包,看看人们能提出什么答案。