Interface 派生数据类型中的Fortran赋值运算符接口
我有以下代码:Interface 派生数据类型中的Fortran赋值运算符接口,interface,fortran,assignment-operator,derived-types,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 Assign
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%1”、“TSTest%2”或“TSTest%3”。如果“一”、“二”和“三”不是私人的,那就微不足道了。但是,目标是保持它们的私有性,并通过接口分配访问它们。用于访问“2”或“3”的任何附加模块过程都将具有相同的伪参数,从而导致编译时错误
然而,解决这个问题的另一种方法是“setter”/“getter”例程,但我在网上的某个地方读到,通过赋值访问varialbe要比通过“getter”例程快得多
任何建议
谢谢您定义的作业例程的开销与“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()
如果我当时觉得很有创意,我还可以为一元“access”运算符向类型添加一些泛型类型绑定:
TYPE, PUBLIC :: TestOne
PRIVATE
INTEGER :: One, Two, Three
CONTAINS
PROCEDURE :: GetOne
...
GENERIC :: OPERATOR(.TheOneOutOf.) => GetOne
...
b = .TheOneOutOf. TSTTest
尽管有时候这种创造性让我对编译器供应商的支持渠道过于熟悉
(考虑将定义的赋值类型绑定。)您定义的赋值例程与“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()
如果我当时觉得很有创意,我还可以为一元“access”运算符向类型添加一些泛型类型绑定:
TYPE, PUBLIC :: TestOne
PRIVATE
INTEGER :: One, Two, Three
CONTAINS
PROCEDURE :: GetOne
...
GENERIC :: OPERATOR(.TheOneOutOf.) => GetOne
...
b = .TheOneOutOf. TSTTest
尽管有时候这种创造性让我对编译器供应商的支持渠道过于熟悉
(考虑将定义的赋值类型设为绑定。)