我想知道是否有一种优雅的方法可以避免重复应用于SELECT TYPE construct
中不同类型的代码块。考虑例如:
select type (var)
type is (t1_t)
codeA (many lines of code)
type is (t2_t)
codeA (same lines)
...
type is (tn_t)
codeB
class default
codeC
end select
答案 0 :(得分:2)
与select case
构造不同,您可以在同一案例声明中对多个测试进行分组,select type
构造中没有这样的工具。
原因是:在每个type-guard语句的块中,选择器(你匹配的变量或表达式)将具有与type-guard语句中命名的相同类型,并且在那里不会是多态的。这就是Fortran中动态类型解析的方式,即静态类型。
select type (var)
type is (t1_t)
! Here, type of var is t1_t, and you can call
! procedures that use type(t1_t) as arguments with var
type is (t2_t)
! Here, type of var is t2_t, and procedures expecting
! type(t1_t) as arguments won't work with var
...
end select
因此,编译器不允许您在同一个类型保护中对许多类型进行分组,因为它不知道要在选择器上应用哪种动态类型。
作为旁注,与c-derived语言中的switch语句不同,Fortran中的select构造不会通过,即在Fortran中匹配后,执行相应的块并且控件退出构造。
正如@cup所说,你可以转换你在子程序中各个分支上的共同点,以避免重复。但请注意,如果您需要将var
传递给例程,则必须将其声明为多态虚拟。
答案 1 :(得分:0)
正如francescalus在评论中指出的,重复相同代码行的典型方法是使用包含文件。这是一种传统技术,曾经广泛用于普通街区,也用于穷人的模板。
included.f90:
codeA (many lines of code)
main.f90时:
select type (var)
type is (t1_t)
include "included.f90"
type is (t2_t)
include "included.f90"
...
end select
如果使用C预处理器,也可以使用预处理器的#include
。
答案 2 :(得分:0)
“类型为”建议的构造的重载运算符类型。这需要作为子程序或函数在模块中。我主要使用函数,所以如果一个函数与C混合,那么子例程可能比试图返回向量的函数更容易。
它仍然是完全相同的代码,只是对复数,浮点数,双精度或各种整数但深度进行操作...所以没有明确的'类型',因为根据争论选择了正确的版本类型。