在具有无限多态实体的Fortran中,通用解析是否可行

kva*_*our 8 fortran

当您尝试通过通用接口或组合模块或通过类型绑定过程重载子例程时,必须考虑具有相同通用名称的任何过程必须具有可区分或不兼容的参数.

当使用无限多态实体时,您可以快速运行这个令人难以置信的教育示例中演示的问题:

INTERFACE foobar
  SUBROUTINE foo(x)
    INTEGER :: x
  END SUBROUTINE foo
  SUBROUTINE bar(x)
    CLASS(*) :: x
  END SUBROUTINE bar
END INTERFACE foobar
Run Code Online (Sandbox Code Playgroud)

在这里,foo(x)bar(x)作为参数的冲突bar也可以是一个INTEGER.

可以使用SELECT TYPE新子例程中的构造来解决此特定问题,该子例程替换了通用接口:

SUBROUTINE foobar(x)
  CLASS(*) :: x
  SELECT TYPE (x)
    TYPE IS INTEGER
      CALL foo(x)
    CLASS default
      CALL bar(x)
  END SELECT
END SUBROUTINE foobar
Run Code Online (Sandbox Code Playgroud)

然而,有时这样的结构会变得乏味且不必要.

是否有其他方法可以在不使用构造的情况下实现此类专业化SELECT TYPE

小智 1

我认为上面使用 SELECT TYPE 构造是实现此类要求的最佳方法。根据 Fortran 2018 规范,上述程序中 INTERFACE foobar 的使用不是规范确认,因为整数 x 和 class(*) x 是 TKR 兼容的。编译器应该为上述程序生成编译时错误。我认为除了用过程替换通用接口并使用选择类型构造来调用特定过程之外,没有更好的解决方法。

Fortran 2018 规范的片段:

通用声明的限制:

两个虚拟参数在以下情况下是可区分的:它们都是数据对象或已知为函数,并且 TKR 彼此都不兼容。