是否可以为不同类型的两个指针使用相同的通用名称?以下当然不起作用,但应该明确我的意思:
real(4), pointer :: s_p
real(8), pointer :: d_p
generic :: p => s_p,d_p
对于procdures,可以使用定义可命令性过程的接口module procedure
来完成这些事情,对于类型绑定过程,存在与给定示例类似的generic
类型。所以我想知道是否存在这样的指针。
我想提一下,无限多态指针(class(*)
)可能不是我想要的,因为我试图将现有的库推广到双精度输入,因此我还有更多在实现select type
块时,不仅仅是在任何地方定义两个指针。
编辑:
当然可以将同一指针与不同类型/种类的变量相关联。只是一些例子:
program test
implicit none
real(4),target :: a
real(8),target :: b
class(*),pointer :: p
a=2e0
b=3d0
p=>a
call printer(p)
a=a+4e0
call printer(p)
p=>b
call printer(p)
associate (u=>a) ! for me it's still a miracle why this even works
print*,u
a=a+3e0
print*,u
end associate
associate (u=>b)
print*,u
end associate
contains
subroutine printer(p)
class(*),pointer :: p
select type (p)
type is (real(4))
p=p+2d0 ! even the wrong 2d0 gets converted correctly
print*,p
type is (real(8))
print*,p
end select
end subroutine
end program
我对这个解决方案的问题是我必须在库中使用指针的地方实现select type
块。 (目前我只知道很多地方。)
所以主要问题是无限多态指针(示例中的p)保持多态,除非它在select type
环境中使用。这当然是必要的,因为指针可以是一切。所以实际的问题是:是否有可能事先告诉多态指针:你只能是这个或那个(例如真实(4)或真实(8))并且依赖于它与之相关的东西,它知道什么是吗?
答案可能是否定的,但目前我并没有真正看到,在这种情况下,compliler可能会有问题来区分类型/种类。