【发布时间】:2020-12-13 06:10:49
【问题描述】:
我有一个多项式类TPoly,请参见下面的代码,它采用系数数组coefs 并使用eval 方法在某个点x 评估多项式。我想知道是否可以通过使实例p 可调用来直接评估多项式,即使用p(x) 而不是p%eval(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
【问题讨论】:
标签: class oop fortran callable