【问题标题】:Fortran: Handling types with different kind in generic procedures [duplicate]Fortran:在通用过程中处理不同类型的类型[重复]
【发布时间】:2015-03-30 10:50:08
【问题描述】:

有没有一种方法可以定义通用过程来动态处理intcharacterreal 中的每个kind,而不必为每个过程指定一个过程?我想这也是在询问 kind 多态是否存在于 Fortran 中。

我正在考虑类似这样的接口:

module generics_test

interface read_generic
    module procedure read_int, &
                     read_real, &
                     read_char
end interface read_generic

contains

subroutine read_int(value)
    implicit none
! Arguments
    <what sort of type spec could go here?> :: value
! Implementation
    <would there need to be some kind handling here?>
end subroutine read_int

<other read subroutines here>

end module generics_test

Fortran 2003 中的多态性似乎侧重于派生类型,例如 Portland Group 的 examples。我只对内在类型的泛型处理感兴趣。

这主要是出于好奇,因为我们几乎只使用 integercharacterreal(8) 的默认值。 (注意,我知道我们应该使用iso_fortran_env,但并非我们使用的所有编译器都支持它。)

【问题讨论】:

  • 对,我的回答中提到的问题不是直接重复的,但这可能是。虽然,搜索这些技术的人不必了解 C++ 和模板。我会在关闭前等待其他投票。
  • 注:您不必使用iso_fortran_env。您真正应该 使用的是种类常量,而不是仅将 (8) 放在那里。您在哪里获得恒定值完全取决于您,iso_fortran_env。只是众多可能性之一。
  • 所以我使用我自己的精度模块,其变量定义为dp = selected_real_kind(x, y),但重构整个代码以使用这种东西有点困难。我这样做是因为我的新东西被很好地划分,但不是所有的东西。
  • 我的意思是 kind,我想。我特别考虑了不同类型的real,因为默认值可能因编译器而异(以及编译器标志),而且我们的大部分代码只有默认的kind。我的问题更多的是关于我是否需要实现read_real4read_real8read_real16 等。
  • 我编辑了代码以使其更清晰。

标签: generics fortran


【解决方案1】:

不,这是不可能的。即使是参数化的派生类型也不行。

您必须手动创建每个特定过程。预处理器有很多技巧可以帮助你做一些穷人的 C++ 式的诱惑。甚至可以在 StackOverflow 上找到示例。请参阅STL analogue in Fortran 等。

【讨论】:

  • 不太适合单独提出问题,但您知道这样做是否有充分的理由吗?是否在任何 Fortran 规范会议上都考虑过它?
  • 正确设计是一件相当困难的事情。 C++ 也不会为所有类型实例化模板。为每种类型创建一个实例很容易导致代码膨胀。当然有关于 Fortran 元编程的想法,但据我所知,总是有其他优先事项。即将推出的标准侧重于 Coarrays 和 C 互操作性以及小的添加和修复。也许下一轮会有一些活动。您可以尝试在 comp.lang.fortran 询问在哪里可以找到许多委员会成员。官方最新消息:nag.co.uk/sc22wg5
  • 在 N2015.txt 中发现:“早期通过参数化模块或智能宏在 Fortran 中提供类似模板的工具的尝试未能达成共识。另一方面,程序员反馈表明,没有具有此功能被认为是该语言中最严重的差距。很明显,由于规范的规模和工作量很大,因此无法考虑将其包含在下一版本中。因此建议将其推迟到技术规范将在下一个标准发布后发布。”
猜你喜欢
  • 2016-03-23
  • 2013-09-02
  • 1970-01-01
  • 2019-08-02
  • 2020-03-02
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多