访问运营商" [],(),{}"在Fortran 90或2003中超载

时间:2014-08-30 23:12:16

标签: fortran operator-overloading fortran2003

我可以在FORTRAN 2003中为派生数据类型重载入口访问运算符[],()或{}吗?在以下示例中,我想为派生数据类型“custom”定义访问方案。

type custom
   integer, dimension(:), allocatable :: a
end type custom

type(custom) :: t

! after some initialization 
! .....
! .....
! .....
!
t%a( (/ 1, 2, 5 /) ) ! return entries located in positions 1, 2, and 5
t{ (/ 1, 2, 5 /) }   ! ?????? I want to define what stuff it should return 

我该怎么做?

更新:

请注意,我不想直接使用数组“t%a”并对其执行常规子数组操作。相反,我想重新定义数据类型“自定义”的数组操作,这样t {'first'}应该返回指针t%a或t%a(1)中的第一个条目,所以我可以说

t['first']= 18 

print *, t['first']. 

还有额外的重载我希望得到像t [1] = 18这样的功能,比如t ['first'] = 18。

1 个答案:

答案 0 :(得分:2)

这取决于你所说的“回归”。

本身提供的例子

t%a([1,2,5])   ! Using syntax offered by Fortran 2003

不会返回任何内容:它是子对象。通过引用该子对象,我们可以做各种事情:

print *, t%a([1,2,5])
t%a([1,2,5]) = 27
t%a([1,2,5]) = sin(real(t%a([1,2,5])))

但仍然没有“回归”的概念。至关重要的是,正如我们将要看到的,这些不是表达。

回答这个问题,t[]t()t{}是什么意思,然后答案就是“不”。 * 你可以例如,想要说:

t[1,2,5] = 1

表示

t%a[1,2,5] = 1

但这不是需要考虑的事情。

可以创建一个像

这样的表达式
print *, t%ref([1,2,5])

但我们完全处于不可定义的领域。

然而,正如你现在提到的指针,还有更多要说的。虽然首选语法t[1]t["first"]不可用,但我们仍然可以选择类型绑定过程。例如,函数调用t%ref("first")很可能能够返回指向t%a的第一个元素的指针。例如,t%ref(1)可能就像

module reference

  implicit none

  type custom
     integer, dimension(:), allocatable :: a
   contains
     procedure ref
  end type custom

contains

  function ref(t, idx)
    class(custom), target, intent(in) :: t
    integer, intent(in) :: idx
    integer, pointer :: ref

    ref => t%a(idx)
  end function ref

end module reference

  use reference
  implicit none

  type(custom), target :: t
  integer, pointer :: b

  t%a = [1, 2, 3, 4, 5]

  print *, t%a
  b => t%ref(1)  ! Fortran 2008 allows direct assignment
  b = 8          ! but compiler support is very limited.
  print *, t%a

end

如果需要,ref可以通用,以便t%ref("first")(等)可以接受。


* 我的理由是这里t是一个标量。但是,正如弗拉基米尔F在评论()[]中提到的可能意味着事情。第一个涉及阵列,第二个涉及共阵。那么,语法是一个问题,但这个答案更多地关注机制而不是语法。