首页 > 解决方案 > 在 Fortran2018 中返回派生类型的向上转换函数指针

问题描述

这是示例。

module example

  type scheme_object
  end type scheme_object

  type, extends( scheme_object ) :: scheme_primitive_procedure
     procedure(packageable_function), pointer, nopass :: proc_pointer
  end type scheme_primitive_procedure
  abstract interface
     function packageable_function() result( retval )
       import :: scheme_object
       class(scheme_object), pointer :: retval
     end function packageable_function
  end interface

contains

  recursive function make_primitive_procedure_object() result( retval_pointer )
    type(scheme_primitive_procedure), pointer :: retval
    class(scheme_object), pointer :: retval_pointer
    allocate( scheme_primitive_procedure :: retval )
    retval%proc_pointer => make_primitive_procedure_object
    retval_pointer => retval
  end function make_primitive_procedure_object

end module example

MWE 以使代码更短为名有点过于复杂。简单来说,scheme_primitive_procedure 的实例应该封装返回scheme_object 的各种子类型的函数。

在 make_primitive_procedure_object 中,结果类型是 scheme_object 的子类型,表示返回方案对象的函数。

这段代码有什么问题?问题是我真的不想从我的程序中只返回类(scheme_object)。我希望我的程序返回指向 scheme_object 的各种子类型的指针,而无需显式向上转换。

这可能吗?

标签: fortran

解决方案


如果过程指针对象具有显式接口(具有多态参数的过程指针对象需要此接口 - F2018 15.4.2.2p1),则目标过程的特征必须匹配(纯粹性) - 10.2。 2.4p3)。作为函数的过程的特征包括函数结果的声明类型(15.3.1p1/15.3.3p1)。

过程的函数结果的声明类型必须与过程指针的函数结果的声明类型相匹配。


推荐阅读