Fortran Assignment运算符派生数据类型中的接口

时间:2013-10-02 01:43:22

标签: interface fortran assignment-operator derived-types

我有以下代码:

    Module Hello
      Implicit None
    Type, Public :: TestOne
       Private
       Integer :: One, Two, Three
     contains
       Procedure, Pass, Public :: Set => SetSub
    End type TestOne
    Private :: SetSub
    Interface Assignment(=)
       Module Procedure SubgetValue
    End Interface Assignment(=)
    contains
      Subroutine SetSub(this)
        Implicit none
        Class(TestOne), Intent(InOut) :: this
        this%one=1
        this%two=2
        this%three=3
      End Subroutine SetSub
      Subroutine SubGetValue(ISOut,TSIn)
        Implicit None
        Integer, Intent(Out) :: ISOut
        Class(TestOne), Intent(In) :: TSIn
        ISOut=TSIn%one
      End Subroutine SubGetValue
    End Module Hello
    Program Test
      use Hello
      Implicit None
      Type(TestOne) :: TSTest
      Integer :: b
      call TSTest%Set()
      b=TSTest
      write(*,*) b
    End Program Test

在这个版本中,我只能通过“=”访问“TSTest%One”。 问题是我如何创建一个接口分配,以便我可以访问“TSTest%one”,“TSTest%two”或“TSTest%three”。如果“一个”,“两个”和“三个”不是私人的,那将是微不足道的。但是,目标是将它们保密,并通过接口分配访问它们。访问“Two”或“Three”的任何其他模块过程都将具有相同的伪参数,从而导致编译时错误。

然而,解决该问题的另一种方法是“setter”/“getter”例程,但我在网上的某处读过,通过赋值访问varialbe比通过“getter”例程快得多。

任何建议。

由于

1 个答案:

答案 0 :(得分:4)

您定义的赋值例程与“getter”具有相同的开销 - 因为它就是它。

如果(何时)编译器的过程间优化达到了划痕,则不应该有任何额外的开销,特别是在TSTest对象不是多态的情况下。

在您编辑之前......

除了通过混合类型赋值提取任何明显的单一候选者之外,我首选的方法是使用单独的绑定来访问每个组件。

TYPE, PUBLIC :: TestOne
  PRIVATE
  INTEGER :: One, Two, Three
CONTAINS
  PROCEDURE :: GetOne
  PROCEDURE :: GetTwo
  PROCEDURE :: GetThree
  ...

FUNCTION GetOne(this)
  CLASS(TestOne), INTENT(IN) :: this
  INTEGER :: GetOne
  GetOne = this%One
END FUNCTION GetOne
...

b = TSTTest%GetTwo()

如果我感觉很有创意,我也可以为这种类型的一元“访问”运算符添加一些泛型类型绑定:

TYPE, PUBLIC :: TestOne
  PRIVATE
  INTEGER :: One, Two, Three
CONTAINS
  PROCEDURE :: GetOne
  ...
  GENERIC :: OPERATOR(.TheOneOutOf.) => GetOne
...

b = .TheOneOutOf. TSTTest
虽然有时候这种创造力让我对我的编译器供应商的支持渠道过于熟悉。

(考虑使定义的赋值类型绑定。)