fortran - 在 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 的各种子类型的指针,而无需显式向上转换。
这可能吗?
解决方案
如果过程指针对象具有显式接口(具有多态参数的过程指针对象需要此接口 - F2018 15.4.2.2p1),则目标过程的特征必须匹配(纯粹性) - 10.2。 2.4p3)。作为函数的过程的特征包括函数结果的声明类型(15.3.1p1/15.3.3p1)。
过程的函数结果的声明类型必须与过程指针的函数结果的声明类型相匹配。
推荐阅读
- java - Eclipse Photon 中的 Spring Boot 调试模式不起作用
- c# - c# Moq objects void方法,改变objects参数值
- hadoop - Apache Phoenix 无法创建架构
- excel - 在 Excel VBA 中暂停循环,直到另一个 Sub 完成
- c# - 检查 sql 数据库中是否存在记录返回错误结果
- react-native - 反应原生找不到变量中心
- javascript - TypeError: UserSchema is not a constructor (Schema is not a constructor MongoDB)
- python - 如何使用 Discord.py 重写更改机器人用户名/头像?
- c# - VS30063突然抛出错误:您无权访问
- python-3.x - Is there a way to read disk access times in python?