簡體   English   中英

Fortran:指向方法的過程指針

[英]Fortran: procedure pointer to method

我處於以下情況:我有一個 object 必須用一些輸入參數x初始化(不着急)。 然后它有一個必須運行(快速)的方法do_work 現在,根據xdo_work可以是 function f1f2 當然,當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引入了一些虛擬 function 表查找,我也很好奇(我不明白為什么應該這樣做,但正如我所說,我是新手)

按順序回答您的問題:

  • 看起來你沒有做任何危險或錯誤的事情。 這在我看來像是過程指針的一個很好的用例,而且你的實現看起來不錯。
  • abstract interface基本上只是定義過程指針的“類型簽名”。 它不會增加任何開銷。
  • 每次調用fptr時,您都會(除非它以某種方式優化)有單指針查找的開銷。 這可能會或可能不會干擾一些可能的編譯器優化。 真的很難說這是否真的會有意義地減慢任何東西,而不僅僅是嘗試查看並運行代碼分析器來找出答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM