Sie überlasten müssen alle möglichen Aufgaben, Operatoren und Intrinsics. Ja, es ist eine Menge Arbeit. Nein, es gibt keinen schnelleren Weg, der eine automatische Konvertierung in allen Kontexten verursachen würde.
module types
use iso_fortran_env
implicit none
type MYTYPE_t
real(real64) :: data
contains
procedure assign
procedure add
generic :: assignment(=) => assign
generic :: operator(+) => add
end type MYTYPE_t
interface sqrt
procedure sqrt_MTYPE
end interface
contains
subroutine assign(l,r)
class(MYTYPE_t), intent(out) :: l
real(real32), intent(in) :: r
l%data = r
end subroutine
real(real64) function sqrt_MTYPE(x)
type(MYTYPE_t), intent(in) :: x
sqrt_MTYPE = sqrt(x%data)
end function
real(real64) function add(x, y)
class(MYTYPE_t), intent(in) :: x
integer, intent(in) :: y
add = x%data + y
end function
end module types
program test_program
use types
implicit none
type(MYTYPE_T) :: test
real(real64) :: foo
! This works
test%data = 5.0
! Is there a way to be able things like this:
test = 5.0
print*, sqrt(test)
foo = test + 3
end program
Test:
> gfortran override3.f90
> ./a.out
2.2360679774997898
Hat definierte Zuordnung Ihre Anforderungen abdecken? – IanH
Es funktioniert irgendwie. Aber das Problem ist, dass man dann alle Standardoperatoren überschreiben muss, und es wird nicht mit Fortran-Intrinsics funktionieren. – cphyc
Es wird funktionieren, sehe meine Antwort. –