我的问题是,“可以使用 select type
block 来区分 real::realInput
和 real::realArrayInput(:)
?”很清楚 select type
可以如何用于区分派(dispatch)生类型,但我不太清楚它如何(或是否)可以用于内部类型。
在Mad Libs表格中,下面的空格可以用来区分上面的输入吗:
select type (input)
type is (real)
print *, "I caught the realInput"
type is (___________)
print *, "I caught the realArrayInput"
end select
我发现一些相关的帖子并没有完全包含我所希望的答案:
最佳答案
没有。 input
被声明为数组或标量,即使它是多态的(甚至是无限多态的)。
最近与 C TS(可能是 F201X 的一部分)的进一步互操作性引入了假设等级和 RANK 内在的概念,它们可以做你想做的。但是对于假定等级的对象可以做什么有很多限制。不管那个 SELECT TYPE 仍然只适用于类型。选择类型构造的语法根本不允许在类型保护语句中指定等级。
显然取决于您实际想要做什么(?)...除了其他人提到的通用接口(interface)之外,一种在当前 Fortran 中拥有可以是数组或标量的对象的方法(还有其他可能性)是使用作为公共(public)父类型扩展的派生类型包装器。然后,您可以使用声明为父类型的多态对象(或者您可以使用无限制的多态对象)来引用相关派生类型的对象。
TYPE :: parent
END TYPE parent
TYPE, EXTENDS(parent) :: scalar_wrapper
REAL :: scalar_component
END TYPE scalar_wrapper
TYPE, EXTENDS(parent) :: array_wrapper
REAL :: array_component(10)
END TYPE array_wrapper
...
SUBROUTINE what_am_i(object)
! Note that object is scalar, but that doesn't tell us
! the rank of the components of the dynamic type of object.
CLASS(parent), INTENT(IN) :: object
!****
SELECT TYPE (object)
TYPE IS (scalar_wrapper)
PRINT "('I am a scalar with value ',G0)", &
object%scalar_component
TYPE IS (array_wrapper)
PRINT "('I am an array with values ',*(G0,:,','))", &
object%array_component
CLASS DEFAULT
PRINT "('I am not sure what I am.')"
END SELECT
END SUBROUTINE what_am_i
关于oop - Fortran 2003,选择类型以区分 'real' 和 'real array',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22315606/