我有一个多项式类 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 中的上下文中不存在。
关于class - 是否可以在 Fortran 中使类实例可调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63563812/