Fortran中用户定义的运算符

我有一个关于在Fortran中编程用户定义的运算符的正确方法的问题.更具体地说,我将提供我的问题的例子.我正在为称为“粒子”的球形粒子创建用户定义的数据类型.我想定义一个运算符,它接受现有的Particle对象数组并向其添加一个新的Particle对象.我想知道如何定义用户定义的运算符来执行此类操作.

目前我在粒子的类型定义中有以下几行:

procedure, public:: addNewParticleTo
generic:: operator(.spawn.) => addNewParticleTo

接下来,我有一个子程序,定义如下:

subroutine addNewParticleTo(a_LHS, a_RHS)
  implicit none
  class(Particle), dimension(:), allocatable, intent(in):: a_LHS
  class(Particle), dimension(:), allocatable, intent(inout):: a_RHS
  <rest of the code>
end subroutine addNewParticleTo

我打算将运算符调用为:

particle .spawn. particleArray

我想知道这是否是正确的方法.对此提出任何建议或建议将非常有帮助.

最佳答案 要扩展注释,您需要将运算符代码作为函数.此外,每个输入都需要是意图(in).这确实会允许像array = particle .spawn这样的东西.阵列.

但是,子例程需要进行另一项更改:您的一个参数应该是标量. [第一个,除非你使用pass属性.]

function addNewParticleTo(A, B) result(C)
  class(particle), intent(in) :: A
  class(particle), allocatable, intent(in)  :: B(:)
  class(particle), allocatable :: C(:)
  ! ... code to do the appending
end function

最后,我的建议是将此作为一个类型绑定的运算符使事情变得非常复杂,具有多态性等等.另外,array = particle .spawn.数组似乎非常不直观.

相反,只是一个普通的子程序,以便调用add_to_particle_array(all_particles,new_particle)看起来更干净.这更接近您的原始代码,但不回答您关于操作符的问题,唉.

点赞