为多个参数重载 Present
Overloading Present for multiple arguments
是否可以重载 Present(arg) 这样我就可以拥有
Present(arg1,arg2,...) 表示
If (Present (arg1) .And. Present (arg2) .And. ... )
我正在尝试做,但感觉好像做起来不是那么简单。
有趣的是,答案是:不,你不能。您确实可以创建一个名为 present
的通用标识符并拥有一个新的特定名称:
module mod
interface present
module procedure present_two_real
end interface
contains
logical function present_real_real(a,b)
..
end function
end module
然而,在该函数内部我们知道伪参数必须是 optional
。如果不是,则将过程中的可选实际参数传递给该函数是不合法的:请参阅 Fortran 2008 12.5.2.12。
当我们查看两个过程必须如何不同才能具有相同的通用标识符 (12.4.3.4.5) 时,我们有约束 C1215。新的特定名称中的 optional
要求就是这种约束,这使我们无法执行您想要的操作。请注意,特定过程中的参数 present
不是可选的。
当然,这并不意味着您不能拥有通用的 present_all
。不过,您需要为所需的每个参数特征组合制定一个特定的过程(正如我在上面选择的特定名称所暗示的那样)。 [回想一下,模板不是 Fortran 的风格。]此外,您仍然需要处理区分特定实现的需求。听起来工作量有点大,真的。
是否可以重载 Present(arg) 这样我就可以拥有 Present(arg1,arg2,...) 表示
If (Present (arg1) .And. Present (arg2) .And. ... )
我正在尝试做,但感觉好像做起来不是那么简单。
有趣的是,答案是:不,你不能。您确实可以创建一个名为 present
的通用标识符并拥有一个新的特定名称:
module mod
interface present
module procedure present_two_real
end interface
contains
logical function present_real_real(a,b)
..
end function
end module
然而,在该函数内部我们知道伪参数必须是 optional
。如果不是,则将过程中的可选实际参数传递给该函数是不合法的:请参阅 Fortran 2008 12.5.2.12。
当我们查看两个过程必须如何不同才能具有相同的通用标识符 (12.4.3.4.5) 时,我们有约束 C1215。新的特定名称中的 optional
要求就是这种约束,这使我们无法执行您想要的操作。请注意,特定过程中的参数 present
不是可选的。
当然,这并不意味着您不能拥有通用的 present_all
。不过,您需要为所需的每个参数特征组合制定一个特定的过程(正如我在上面选择的特定名称所暗示的那样)。 [回想一下,模板不是 Fortran 的风格。]此外,您仍然需要处理区分特定实现的需求。听起来工作量有点大,真的。