返回多态类

时间:2017-01-06 18:46:11

标签: function generics fortran polymorphism

我试图理解为什么标准允许下面的一个而另一个不允许。除了样板代码,它们似乎没有什么不同。我觉得我误解了某些东西,或者说有更好的方法。任何帮助,将不胜感激。

不允许:

real :: x
class(*) :: temp

x = 4

temp = genericAssignment(x)

select type(temp)
type is(real)
    write(*,*) temp
end select

contains

function genericAssignment(a) result(b)
    class(*) :: a
    class(*) :: b

    allocate(b, source=a)
end function genericAssignment

允许:

Type GenericContainer
    class(*), pointer :: gen
End Type

real :: x
class(*) :: ptr
type(GenericContainer) :: temp

x = 4

temp = genericAssignment(x)

select type(ptr => temp%gen)
type is(real)
    write(*,*) ptr
end select

contains

function genericAssignment(a) result(b)
    class(*) :: a
    type(GenericContainer) :: b

    allocate(b%gen, source=a)
end function genericAssignment

1 个答案:

答案 0 :(得分:1)

目前的标准允许两者。

“允许”代码块具有非多态结果的函数,其结果是将函数评估为非多态变量。这是有效的Fortran 2003。

“不允许”块具有带有多态结果的函数,其结果是评估将函数分配给多态变量。这是有效的Fortran 2008。

请注意,那里完整的Fortran 2008编译器实现的数量很少。

~~~

“不允许”块中的函数有点无意义 - 代码块相当于:

real :: x
class(*) :: temp

x = 4

temp = x

select type(temp)
type is(real)
  write(*,*) temp
end select