可区分指针的通用名称

时间:2015-04-29 16:10:53

标签: pointers generics fortran

是否可以为不同类型的两个指针使用相同的通用名称?以下当然不起作用,但应该明确我的意思:

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可能会有问题来区分类型/种类。

0 个答案:

没有答案