如何解决是否可以在Fortran中使类实例可调用?
我有一个多项式类TPoly
,请参见下面的代码,该类采用系数coefs
的数组,并使用x
方法在某个点eval
处评估多项式。我想知道是否可以通过使实例p
可调用来直接评估多项式,即使用p%eval(x)
代替p(x)
。在Python中,可以通过定义__call__
方法来实现期望的行为。 Fortran中是否存在类似的东西?
我想制作另一个包含许多TPoly
属性的类,并且我希望避免链接组件选择object%poly1%eval(x)
。指向类方法的函数指针可以解决我的问题,但我发现不可能,请参见another thread。
module polymod
implicit none
integer,parameter :: rp = kind(1.0d0)
! polynomial class
type :: TPoly
real(rp),allocatable :: coefs(:)
contains
procedure,pass :: eval => eval_poly
end type
contains
real(rp) function eval_poly(self,x)
class(TPoly),intent(in) :: self
real(rp),intent(in) :: x
eval_poly = polynomial(x,self%coefs)
end function eval_poly
! use Horner's method to evaluate polynomial
real(rp) function polynomial(x,coefs)
real(rp),intent(in) :: x,coefs(:)
real(rp) :: p
integer :: n,i
n = size(coefs)
p = coefs(n)
do i = n-1,1,-1
p = p * x + coefs(i)
end do
polynomial = p
end function polynomial
end module polymod
program main
use polymod
implicit none
type(TPoly) :: p
real(rp) :: coefs(3)
real(rp) :: x = 2.0_rp
coefs = (/3.0_rp,-1.0_rp,1.0_rp/)
p = TPoly(coefs)
print *,p%eval(x)
! I would like to use
! print *,p(x)
end program main
解决方法
不幸的是,不,这是不可能的。据我所知,也没有很好的解决方法可以模拟这种行为。
如果可能,则需要避免与Fortran的数组访问语法冲突。请考虑以下内容:
program main
use polymod
implicit none
! Declare an array of type TPoly.
type(TPoly) :: p(1)
! Initialise the array.
p = [TPoly(coefs=[3.0_rp,-1.0_rp,1.0_rp])]
! Try to print.
print *,p(1)
end program
编译器无法区分引用数组p(1)
的第一个元素的p
与p(1)
调用类函数作为elemental
函数使用参数p
对1
的每个元素进行操作。
对于非基本功能,您可以将二者区分开,但是您需要使用p(1)(2.0_rp)
之类的语法,并且就目前情况而言,这种语法在Fortran中并不存在。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。