我有一个Fortran派生类型T,它包含(许多)不同等级和类型的数据数组.这些数组隐藏在一个复杂的数据结构中,我想有一个getter函数,它执行以下操作:
a => T%get(data_id)
Run Code Online (Sandbox Code Playgroud)
其中"a"是给定类型的数组指针,data_id是一个整数,用于查找数据结构内的数据.我通过在通用名称下重载许多"get_thistype()"函数来做到这一点.
TYPE T
PROCEDURE :: get_real
PROCEDURE :: get_integer
GENERIC :: get => get_real,get_integer
END TYPE
Run Code Online (Sandbox Code Playgroud)
如果get_thistype()例程是子例程,则此方法有效,但如果它们被写为函数则不行.这意味着我的代码如下:
CALL T%get(a,data_id)
Run Code Online (Sandbox Code Playgroud)
我发现它的可读性要低得多.有没有办法重载具有相同参数列表但返回类型不同的函数?或者我必须使用子程序吗?
小智 5
我刚刚看到这篇文章,所以为了任何人将来看到这一点的好处:
如果我正确理解这个问题,您可以通过重载赋值运算符来完成此任务。例子:
文件X.f90:
MODULE XModule
TYPE :: X
INTEGER, DIMENSION(:), POINTER :: IntArray
REAL, DIMENSION(:), POINTER :: RealArray
END TYPE
INTERFACE ASSIGNMENT (=)
MODULE PROCEDURE PointToInt
MODULE PROCEDURE PointToReal
END INTERFACE
CONTAINS
SUBROUTINE PointToInt(Ip, V)
INTEGER, POINTER, DIMENSION(:), INTENT(OUT) :: Ip
TYPE(X), INTENT(IN) :: V
Ip => V%IntArray
END SUBROUTINE PointToInt
SUBROUTINE PointToReal(Rp, V)
REAL, POINTER, DIMENSION(:), INTENT(OUT) :: Rp
TYPE(X), INTENT(IN) :: V
Rp => V%RealArray
END SUBROUTINE PointToReal
END MODULE
Run Code Online (Sandbox Code Playgroud)
测试驱动文件Driver.f90:
PROGRAM Driver
USE XModule
TYPE(X) :: Var
INTEGER, DIMENSION(:), POINTER :: I
REAL, DIMENSION(:), POINTER :: R
ALLOCATE(Var%IntArray(2))
ALLOCATE(Var%RealArray(3))
Var%IntArray = [1, 2]
Var%RealArray = [1., 2., 3.]
I = Var
PRINT*, I
R = Var
PRINT*, R
END PROGRAM
Run Code Online (Sandbox Code Playgroud)
输出:
1 2
1.000000 2.000000 3.000000
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助。
| 归档时间: |
|
| 查看次数: |
2014 次 |
| 最近记录: |