我想知道如何创建一个返回实数,整数或字符串的函数。
例如,调用将是write(*,*)dt%get()
,其中get()
将返回:
dt%isInteger = .true.
dt%isReal = .true.
dt%isStr = .true.
我相信这可能是通过使用抽象接口使过程get()
指向过程getInteger()
,getReal()
或getStr()
,但抽象接口定义需要定义输出类型,在我的例子中,是变量。
以下是相关代码:
type :: dt
real(dp) :: realValue
integer :: integerValue
character(*) :: strValue
logical :: isReal, isInteger, isStr
procedure(intf), pointer :: get
contains
procedure :: getReal, getInteger, getStr
end type
abstract interface
function intf(self)
import dt
class(dt) :: self
??? :: intf
end function
end interface
有什么想法吗?
答案 0 :(得分:3)
这在Fortran中根本不可能。
您可以使用具有不同特定功能的通用接口,但这些函数必须具有不同类型的参数(请参阅几个内部函数,如transfer()
使用mold
参数)。这称为TKR(类型,种类,等级)分辨率。无法根据参数的值来区分通用函数 。
type :: dt
real(dp) :: realValue
integer :: integerValue
character(*) :: strValue !!!! <= THIS IS WRONG !!!!
logical :: isReal, isInteger, isStr
contains
generic :: get => getReal, getInteger, getStr
procedure :: getReal, getInteger, getStr
end type
function getReal(self, mold)
class(dt) :: self
real, intent(in) :: mold
end function
function getInteger(self, mold)
class(dt) :: self
integer, intent(in) :: mold
end function
function getString(self, mold)
class(dt) :: self
character(*), intent(in) :: mold
end function
如您所见,调用get()
时必须知道正确的类型。你称之为
real_variable = object%get(1.0)
integer_variable = object%get(1)
还要注意不同长度的琴弦。我把它标记在上面。您可能需要character(:), allocatable
。
您还可以创建返回通用容器的函数,然后从容器中提取值。甚至可以使用容器的重载分配直接完成提取。
你也可以只返回一个无限多态变量(class(*)
)。