use*_*557 4 templates fortran class
我有一个模块,它定义了三种类型,并对它们进行了一些操作.
在一个单独的模块中,我想定义一个算法,该算法使用模块中定义的操作对这些类型中的任何一个进行操作.无论类型如何,算法都是相同的.我可以重载它,但我想知道我是否可以通过定义某种模板算法来节省大量的输入.我想到的是像C++中的类模板.
谢谢
Fortran没有模板,但您可以将处理不同类型的函数的代码共同放在包含文件中作为模拟模板的kludge,如下面的代码所示:
! file "cumul.inc"
! function cumul(xx) result(yy)
! return in yy(:) the cumulative sum of xx(:)
! type, intent(in) :: xx(:)
! type :: yy(size(xx))
integer :: i,n
yy = 0
n = size(xx)
if (n < 1) return
yy(1) = xx(1)
do i=2,n
yy(i) = yy(i-1) + xx(i)
end do
return
! end function cumul
! end file "cumul.inc"
module foo
implicit none
integer, parameter :: sp = kind(1.0), dp = kind(1.0d0)
interface cumul
module procedure cumul_double,cumul_real,cumul_int
end interface cumul
contains
!
function cumul_double(xx) result(yy)
real(kind=dp), intent(in) :: xx(:)
real(kind=dp) :: yy(size(xx))
include "cumul.inc"
end function cumul_double
!
function cumul_real(xx) result(yy)
real(kind=sp), intent(in) :: xx(:)
real(kind=sp) :: yy(size(xx))
include "cumul.inc"
end function cumul_real
!
function cumul_int(xx) result(yy)
integer, intent(in) :: xx(:)
integer :: yy(size(xx))
include "cumul.inc"
end function cumul_int
end module foo
program xcumul
use foo, only: cumul
print*,cumul([10,20,30])
print*,cumul(sin([10.0,20.0,30.0]))
print*,cumul(sin([10.0d0,20.0d0,30.0d0]))
end program xcumul
! output:
! 10 30 60
! -0.5440211 0.36892414 -0.6191075
! -0.5440211108893698 0.3689241398382579 -0.6191074842546039
Run Code Online (Sandbox Code Playgroud)
该论文中提到的工具
Car,David和Michael List(2010).PyF95 ++:Fortran 95/2003语言的模板功能.ACM Fortran论坛29(1),2-20.
你可能会感兴趣 我没试过.