这是 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 所说的“服务定位器”。
注意:这出现在我与 Jed Brown 的私人通信中,他向我提出了这个问题。我决定外包它,看看人们能想出什么答案。