我有一个简单的用户定义类型
use, intrinsic :: iso_fortran_env
implicit none
type :: vector
real(real64) :: data(3)
end type
定义了各种接口(interface)以及数组的赋值运算符。
我需要的是一个抽象接口(interface)
interface assignment(=)
procedure v_to_a_assign, a_to_v_assign
end interface
这意味着我可以做类似的事情
type(vector) :: v
real(real64) :: a(3)
a = v
但是我想做的是一个数组构造函数,例如
type(vector) :: v
real(real64) :: q(4)
q = [1d0, v]
! error #8209: The assignment operation or the binary expression operation is
! invalid for the data types of the two operands. [v]
如果v
是一个real(real64)
数组,我就可以做到这一点。 我的问题是我需要定义什么二元运算才能使上述工作正常进行?
上面只是将用户类型隐式转换为数组的一个示例。我想定义正确的运算符,以便我的用户类型在需要时自动转换为数组,例如在函数参数和/或其他构造中。
解决方案
使用关键字real
定义转换接口(interface)。
interface real
procedure v_to_array
end interface
contains
function v_to_array(v) result(a)
type(vector), intent(in) :: v
real(real64), dimension(3) :: a
a = v%data
end function
并将其用作
q = [1d0, real(v)]
<子>引用文献Array Constructors
最佳答案
该语言不支持您所追求的隐式转换。
引用数组组件,可以直接使用数组构造函数中的组件:
q = [1.0_real64, v%data]
或编写适当的访问器函数/一元运算符。
q = [1.0_real64, .getdata. v]
考虑到语言定义通用解析的方式,您寻求的隐式转换将会出现问题。
就风格而言,显式转换通常是首选 - 例如,在分配给 vector
类型的对象时,使用结构构造函数作为表达式,而不是用户定义的分配,使用访问器函数或分配给实数数组时的一元运算符。需要澄清的是,用户定义的赋值不会调用赋值左侧变量的自动(重新)分配。
(Fortran 没有赋值运算符 - 它有一个赋值语句。)
关于fortran - 将用户类型转换为数组的通用接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66217855/