我处于以下情况:我有一个对象,必须用一些输入参数x
初始化(不要着急(。然后它有一个必须运行(快速(的方法do_work
。现在,根据x
,do_work
可以是函数f1
或f2
。当然,当调用do_work
时,我可以在其中进行选择,但是,由于我事先知道选择,所以我想使用过程指针。
我制作了以下MWE
module delegate_m
implicit none
private
type delegate
private
integer :: x
procedure(delegate_function), private, pointer :: fptr
contains
private
procedure:: f2
procedure :: f1
procedure, public :: do_work
end type delegate
interface delegate
module procedure :: init_delegate
end interface delegate
abstract interface
integer function delegate_function(self,y)
import :: delegate
class(delegate) :: self
integer :: y
end function delegate_function
end interface
public :: delegate
contains
type(delegate) function init_delegate(x)
implicit none
integer, intent(in) :: x
init_delegate%x = x
if (modulo(x, 2) == 0) then
init_delegate%fptr => f1
else
init_delegate%fptr => f2
end if
end function init_delegate
integer function f1(self,y)
implicit none
class(delegate) :: self
integer :: y
f1 = y * self%x
end function f1
integer function f2(self,y)
implicit none
class(delegate) :: self
integer :: y
f2 = (y ** 2) * self%x
end function f2
integer function do_work(self, x, y)
implicit none
class(delegate) :: self
integer:: x, y
do_work = self%fptr(x) - y
end function do_work
end module delegate_m
program test
use delegate_m
implicit none
type(delegate) :: d1, d2
d1 = delegate(45)
d2 = delegate(44)
write (*,*) d1%do_work(2, 3)
write (*,*) d2%do_work(2, 3)
end program test
它似乎有效,但我对(现代(Fortran还很陌生,我想知道我是否做错了什么/危险了,因为我正在使用指针。如果abstract interface
引入了一些虚拟函数表查找,我也很好奇(我不明白为什么要这样做,但正如我所说,我是个新手(
按顺序回答您的问题:
- 看起来你没有做任何危险或错误的事情。在我看来,这是过程指针的一个很好的用例,并且您的实现看起来很好
- CCD_ 9基本上只是定义了";类型签名";过程指针的。它不会增加任何开销
- 每次调用
fptr
时,都会有单指针查找的开销(除非以某种方式进行了优化(。这可能会也可能不会干扰某些可能的编译器优化。如果不尝试查看并运行代码探查器来发现,很难说这是否真的会有意义地减慢速度