class - 是否可以在 Fortran 中使类实例可调用?

标签 class oop fortran callable

我有一个多项式类 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/

相关文章:

c++ - 在哪里编写类的实现

Android 事件 : When implementing interfaces is it better to use the outer class or anonymous classes

java - 哪些成员不在子类中继承?

python - 如何检查一个列表是否等于使用类创建的另一个列表?

fortran - 解决 OpenMP 中的段错误的最佳方法

c++ - 在混合源代码中生成调用树或抽象语法树?

c - Fortran 2003 绑定(bind)到 C : how to translate enums and #defines? 中的库

c++ - 在 C++ 中的类外声明函数有什么好处?

python - 博格设计模式

c++ - Qt匿名信号