问题描述
我有一个模块,它定义了三种类型和一些操作。
I have a module that defines three types and and some operations on them.
在单独的模块中,我想使用模块中定义的操作定义对这些类型中的任一类型进行操作的算法。算法是相同的,不管类型。我可以重载它,但我想知道如果我可以通过定义一些类型的模板算法来保存大量的输入。我想的是类似C ++中的类模板。
In a separate module, I want to define an algorithm that operates on either one of these types using the operations defined in the module. The algorithm is the same, regardless of the type. I can overload it, but I was wondering if I can save a lot of typing by defining some sort of template algorithm. What I have in mind is something like class templates in C++.
感谢
推荐答案
Fortran没有模板,但是您可以将处理不同类型的函数的代码放在include文件中作为kludge来模拟模板,如下面代码所示:
Fortran does not have templates, but you can put the code common to the functions handling different types in an include file as a kludge to simulate templates, as shown in this code:
! 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
本文提及的工具
Car,David和Michael List(2010)。 PyF95 ++:Fortran 95/2003语言的模板能力。 ACM Fortran Forum 29(1),2-20。
Car, David and Michael List (2010). PyF95++: A Templating Capability for the Fortran 95/2003 Language. ACM Fortran Forum 29(1), 2-20.
可能会感兴趣。我没有尝试过。
may interest you. I have not tried it.
这篇关于模板在Fortran?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!